소스 코드

T = int(input())

for tc in range(1,1+T):

    # 울음소리
    arr = list(str(input()))

    # 모든 문자 사용했는지 확인을 위한 배열
    visited = [0 for _ in range(len(arr))]

    # 개구리 최소 숫자
    res = -1

    # 한 번의 울음 안에 c가 몇 번 있는가(겹치게 우는 것이 몇 마리인가)
    cnt = 0

    # 시작 위치(c 부터 시작)
    idx = 0

    while True:

        # 임시 cnt(몇 마리인지), 초기화
        temp = 0

        # 임시 idx, 초기화
        temp_idx = 0

        # 울음소리 저장, 초기화
        word = ''

        # 시작 값이 c가 아니면 불가능함
        if arr[idx] != 'c':
            break

        else:
            for q in range(idx, len(arr)):
                if arr[q] == 'c':

                    # word가 '' 이면
                    # c로 만들고, 방문처리
                    if len(word) == 0:
                        word += arr[q]
                        visited[q] = 1

                    # word가 ''이 아니면
                    # temp_idx에 저장된 값이 없으면 q 저장
                    else:
                        if temp_idx == 0:
                            temp_idx = q

                    # 몇 마리인지 세기
                    temp += 1

                # word가 c인 경우
                elif arr[q] == 'r' and len(word) == 1 and visited[q] == 0:
                    word += arr[q]
                    visited[q] = 1

                # word가 cr인 경우
                elif arr[q] == 'o' and len(word) == 2 and visited[q] == 0:
                    word += arr[q]
                    visited[q] = 1

                # word가 cro인 경우
                elif arr[q] == 'a' and len(word) == 3 and visited[q] == 0:
                    word += arr[q]
                    visited[q] = 1

                # word가 croa인 경우
                elif arr[q] == 'k' and len(word) == 4 and visited[q] == 0:
                    word += arr[q]
                    visited[q] = 1

                    # 만일 arr[0:5]의 값이 croak인 경우
                    # temp_idx 값이 변하지 않아서 계속 0번에서 시작함
                    # 그런 경우를 방지하기 위해 temp_idx 값에 q+1 저장
                    if temp_idx == 0:
                        temp_idx = q+1
                    break

        # 배열을 끝까지 다 돌았을 때,
        if q == len(arr) - 1:

            # word가 croak를 완성하지 못하면
            if word != 'croak':
                break

            # visited의 값이 모두 1일 때
            # res에 cnt값 저장
            if visited.count(1) == len(arr):
                res = cnt
                break

            # 아닌 경우 그냥 종료
            else:
                break

        # 배열을 끝까지 돌지 않았을 경우
        else:
            
            # temp가 cnt값보다 크면 cnt에 temp값 저장
            if temp > cnt:
                cnt = temp

            # idx에 temp_idx값 저장
            idx = temp_idx

    print('#{} {}'.format(tc,res))

 


해결 방법

1. 주어진 울음소리 배열(arr)을 끝까지 다 돌면서 croak를 확인

 

2. 시작 값은 무조건 c

 

3. croak 문자열은 완성시켜가는 중에 다른 c를 만나면 idx 값을 저장

 

4. 이후, 기존의 croak를 끝마치면 저장해둔 idx로 돌아가서 다시 시작

 

5. 반복 및 croak를 완성시켜가는 중에 다른 c(시작점)을 만나지 않는 경우 따로 처리


느낀 점

1. 코드의 수를 줄일 수 있는 방법을 고민해 봐야 함

ex) c,r,o,a,k 일일이 검사하는 방식이 아닌 다른 방식

 

2. 이렇게 모든 변수를 직접 처리하는 것은 비효율적이고, 실패할 가능성이 높다고 생각함

(물론 출제자의 의도가 이런 형태일 수도 있지만, 그냥 내 생각에는 내가 무식하게 풀었다고 생각함...)

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.