본문 바로가기
카테고리 없음

백준12933🐨오리-파이썬

by redcubes 2025. 1. 4.

오리

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
2 초 512 MB 6381 2140 1624 33.826%

문제

오리의 울음 소리는 "quack"이다. 올바른 오리의 울음 소리는 울음 소리를 한 번 또는 그 이상 연속해서 내는 것이다. 예를 들어, "quack", "quackquackquackquack", "quackquack"는 올바른 오리의 울음 소리이다.
영선이의 방에는 오리가 있는데, 문제를 너무 열심히 풀다가 몇 마리의 오리가 있는지 까먹었다.
갑자기 영선이의 방에 있는 오리가 울기 시작했고, 이 울음소리는 섞이기 시작했다. 영선이는 일단 울음소리를 녹음했고, 나중에 들어보면서 총 몇 마리의 오리가 있는지 구해보려고 한다.
녹음한 소리는 문자열로 나타낼 수 있는데, 한 문자는 한 오리가 낸 소리이다. 오리의 울음 소리는 연속될 필요는 없지만, 순서는 "quack"이어야 한다. "quqacukqauackck"과 같은 경우는 두 오리가 울었다고 볼 수 있다.
영선이가 녹음한 소리가 주어졌을 때, 영선이 방에 있을 수 있는 오리의 최소 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 영선이가 녹음한 소리가 주어진다. 소리의 길이는 5보다 크거나 같고, 2500보다 작거나 같은 자연수이고, 'q','u','a','c','k'로만 이루어져 있다.

출력

영선이 방에 있을 수 있는 오리의 최소 수를 구하는 프로그램을 작성하시오. 녹음한 소리가 올바르지 않은 경우에는 -1을 출력한다.

예제 입력 출력

quqacukqauackck
2
kcauq
-1
quackquackquackquackquackquackquackquackquackquack
1
qqqqqqqqqquuuuuuuuuuaaaaaaaaaacccccccccckkkkkkkkkk
10
quqaquuacakcqckkuaquckqauckack
3
quackqauckquack
-1

힌트

예제 5의 경우에 다음과 같이 오리 3마리가 울었다고 할 수 있다.

  녹음: quqaquuacakcqckkuaquckqauckack
오리 1: ____q_u__a___ck_______________
오리 2: __q__u_ac_k_q___ua__ckq_u__ack
오리 3: qu_a_______c___k__qu___a_ck___

문제의 이해

오리 소리가 정상적으로 녹음되었다면 소리는 'quack'가 순서대로 들어오게 된다.
그렇다면 한 글자씩 읽어오면서 이전 순서의 글자가 있는지 확인하고 있다면 다음 글자로 갱신해주고
(q의 경우에는 k 다음에 오면 연속된 울음이 된다.)
현재 글자가 q이고 이전 글자가 없다면 새로 append 해 준다.
k로 끝난 개수를 세면 되고, k가 아닌 것이 있거나, 이전 순서의 글자가 없으면 잘못된 녹음이다.(-1출력)

예제 5의 경우 리스트가 아래와 같이 갱신되어 최소 3마리라는 것을 알 수 있다.

q->['q']
u->['u']
q->['u', 'q']
a->['a', 'q']
q->['a', 'q', 'q']
u->['a', 'u', 'q']
u->['a', 'u', 'u']
a->['a', 'a', 'u']
c->['c', 'a', 'u']
a->['c', 'a', 'a']
k->['k', 'a', 'a']
c->['k', 'c', 'a']
q->['q', 'c', 'a']
c->['q', 'c', 'c']
k->['q', 'k', 'c']
k->['q', 'k', 'k']
u->['u', 'k', 'k']
a->['a', 'k', 'k']
q->['a', 'q', 'k']
u->['a', 'u', 'k']
c->['c', 'u', 'k']
k->['k', 'u', 'k']
q->['q', 'u', 'k']
a->['q', 'a', 'k']
u->['u', 'a', 'k']
c->['u', 'c', 'k']
k->['u', 'k', 'k']
a->['a', 'k', 'k']
c->['c', 'k', 'k']
k->['k', 'k', 'k']

 

def s():
 a,p=[],{v:x for v,x in zip('quack','kquac')}
 for i in open(0).read().rstrip():
  if i in 'quack' and p[i] in a:a[a.index(p[i])]=i
  elif i=='q':a.append('q')
  else:print(-1);exit()
 print(a.count('k') if set(a)=={'k'} else -1)
s()

a, p = [], {v: x for v, x in zip('quack', 'kquac')}
이 코드를 통해 오리 소리 트랙을 저장할 빈 리스트와 이전 오리 소리를 알려주는 딕셔너리를 만든다.
for i in open(0).read().rstrip():
  if i in 'quack' and p[i] in a: a[a.index(p[i])] = i
  elif i == 'q': a.append('q')
  else: print(-1); exit()
한 글자씩 읽어오면서
- 유효한 글자고 이전 문자가 있으면 갱신
- 위에서 에러가 났지만 현재 문자가 q면 트랙 추가
- 위에 모두 해당하지 않으면 오류이므로 -1 출력 후 강제 종료.

print(a.count('k') if set(a) == {'k'} else -1)
마지막으로 트랙이 모두 k로 끝나는 정상 상태인지 확인 후 k를 세면 된다.