[SWEA] #5550 나는개구리로소이다

wonyu·2021년 12월 8일
0

algorithm

목록 보기
6/25

문제 링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWWxqfhKAWgDFAW4#none

계획


우선은 문제를 이해하는 것부터 좀 어려워서 계속 들여다봤다. 개구리 한 마리가 연속해서 울 수 있으며 울음소리가 다 끝나지 않았는데('k'가 나오지 않았는데) 새로운 울음소리(새로운 'c')가 시작될 경우 추가적으로 개구리 수를 세야 한다. 단, 위 그림에 있는 테스트케이스에서 개구리의 최소 숫자를 세려면 주황색 개구리 울음소리가 끝난 뒤 시작된 새로운 울음소리는 주황색 개구리의 것으로 보아야 한다.

따라서 나는 아래와 같은 계획을 세웠다.
1. 'c', 'r', 'o', 'a', 'k'의 개수가 모두 같은지 확인할 것
(제대로 끝나지 않은 울음소리가 있을 경우 result = -1이 되므로)
2. 각 알파벳의 개수는 해당 알파벳 이전에 나온 알파벳의 개수보다 작거나 같아야 함
(croak이 corak, kaorc 등 이상한 순서로 나오면 안 되므로)
3. 위 조건을 만족할 경우 c와 k만 스택에 담아 c의 개수를 확인할 것
(겹치는 울음소리 개수를 세기 위함)

코드

T = int(input())
for tc in range(1, T+1):
    frogs = input()
    result = -1
    stack = []
    flag = True
    frog_dict = {
        'c': 0,
        'r': 0,
        'o': 0,
        'a': 0,
        'k': 0,
    }

    if frogs.count('c') == frogs.count('r') == frogs.count('o') == frogs.count('a') == frogs.count('k'):
        for char in frogs:
            frog_dict[char] = frog_dict[char] + 1
            if not frog_dict['c'] >= frog_dict['r'] >= frog_dict['o'] >= frog_dict['a'] >= frog_dict['k']:
                flag = False
                break
            if char == 'c':
                stack.append(char)
            elif char == 'k' and stack:
                result = max(result, len(stack))
                stack.pop()

    if not flag:
        result = -1
    print('#{} {}'.format(tc, result))

풀이방법

각 알파벳의 개수가 같지 않은 경우를 가장 간단하게 걸러낼 수 있으므로 가장 바깥에서 if문으로 처리했다. 이후 입력으로 들어온 문자열에 대해 문자를 하나씩 확인하는데 매번 문자 개수를 비교하려면 딕셔너리를 통해 가져오는 것이 더 빠를 것 같아서 딕셔너리를 사용했다. char == 'k'일 때를 처리하는 부분의 코드를 수정하고 바로 pass가 떴는데, 이 부분에서 무조건 맨 처음에 나온 k에 따라 결과를 얻을 수 있는 게 아니므로 문자를 끝까지 확인하며 겹치는 c의 개수를 확인할 수 있게 했다.

0개의 댓글