https://www.acmicpc.net/problem/12933

문제는 오리의 울음 소리를 분석하여 방 안에 있는 오리의 최소 수를 구하는 문제입니다. 오리의 울음 소리는 "quack"이며, 여러 오리가 동시에 울 경우 소리가 섞일 수 있습니다. 주어진 소리를 통해 올바른 오리의 울음 소리인지 판단하고, 최소 몇 마리의 오리가 있었는지를 계산해야 합니다. 만약 주어진 소리가 올바르지 않은 경우에는 -1을 출력해야 합니다.
1을 출력합니다.예제 입력 1:
quqacukqauackck
예제 출력 1:
2
해석:
q -> u -> q -> a -> c -> u -> kq -> a -> u -> a -> c -> k -> c -> k예제 입력 2:
kcauq
예제 출력 2:
-1
해석:
오리의 울음 소리를 분석하여 최소 몇 마리의 오리가 있었는지 파악하기 위해, 각 오리의 현재 상태를 추적하는 방식을 사용합니다. 오리의 상태는 "quack"의 각 문자에 따라 다음에 어떤 문자를 기대하는지를 나타냅니다.
0: 'q'를 기다리는 상태1: 'u'를 기다리는 상태2: 'a'를 기다리는 상태3: 'c'를 기다리는 상태4: 'k'를 기다리는 상태 (울음이 완료된 상태)counts = [0, 0, 0, 0, 0] 배열을 사용하여 각 상태별로 현재 몇 마리의 오리가 그 상태에 있는지를 저장합니다.k 상태에 있는) 오리가 있으면 그 오리를 재사용하여 새로운 울음을 시작합니다.1을 출력합니다.k 상태) 상태인지 확인합니다.1을 출력합니다.1을 출력합니다.counts = [q_count, u_count, a_count, c_count, k_count]k_count가 1 이상이면, k_count에서 1을 빼고 q_count를 증가시킵니다.q_count를 증가시키고 total_ducks를 1 증가시킵니다.1을 출력합니다.아래는 위의 접근 방식을 구현한 파이썬 코드입니다.
import sys
def main():
S = sys.stdin.read().strip()
quack_sequence = "quack"
# 상태별 카운터: q, u, a, c, k
counts = [0, 0, 0, 0, 0]
total_ducks = 0
for char in S:
if char == 'q':
if counts[4] > 0:
# 이미 울음을 완료한 오리를 재사용
counts[4] -= 1
counts[0] += 1
else:
# 새로운 오리 추가
counts[0] += 1
total_ducks += 1
elif char == 'u':
if counts[0] > 0:
counts[0] -= 1
counts[1] += 1
else:
print(-1)
return
elif char == 'a':
if counts[1] > 0:
counts[1] -= 1
counts[2] += 1
else:
print(-1)
return
elif char == 'c':
if counts[2] > 0:
counts[2] -= 1
counts[3] += 1
else:
print(-1)
return
elif char == 'k':
if counts[3] > 0:
counts[3] -= 1
counts[4] += 1
else:
print(-1)
return
else:
# 유효하지 않은 문자
print(-1)
return
# 모든 오리가 울음을 완료했는지 확인
if any(counts[i] > 0 for i in range(4)):
print(-1)
else:
print(total_ducks)
if __name__ == "__main__":
main()
main()sys.stdin.read().strip()을 사용하여 전체 입력을 한 번에 읽어옵니다.S는 오리들이 내는 소리입니다.counts = [0, 0, 0, 0, 0] 배열을 사용하여 각 상태별 오리의 수를 추적합니다.total_ducks를 0으로 초기화하여 사용된 오리의 총 수를 기록합니다.S를 처음부터 끝까지 순회합니다.k 상태) 확인합니다.1을 출력합니다.1을 출력합니다.counts 배열:total_ducks 변수:counts[4] > 0인 경우:counts[4]를 1 감소시키고, counts[0]을 1 증가시킵니다.counts[4] == 0인 경우:counts[0]을 1 증가시키고, total_ducks를 1 증가시킵니다.1을 출력하고 종료합니다.1을 출력하고 종료합니다.k 상태)에 대한 검증을 수행합니다.counts[0]부터 counts[3]까지가 모두 0이어야 합니다.0이 아니면, 올바르지 않은 소리이므로 1을 출력합니다.O(L)L은 소리 문자열 S의 길이입니다.O(L)입니다.L ≤ 2500) 내에서 매우 효율적입니다.counts 배열: O(1) 공간O(1)counts 배열을 사용하여 각 상태별 오리의 수를 효율적으로 관리합니다.