백준 1316번 그룹 단어 체커 Python3

링크 : https://www.acmicpc.net/problem/1316

소스코드

n = int(input())
cnt=0
basket=[]
for i in range(n):
    basket.clear()
    flag=True
    s=input()
    for j in s:
        if j not in basket:
            basket.append(j)
        if(basket.index(j)+1!=len(basket)):
            flag=False
            break
    if(flag):
        cnt+=1
print(cnt)
        

생각을 좀 많이 했던 문제다. 연속하지 않은 문자가 떨어져서 나올 경우를 어떻게 구분해야 하는가를 고민했다.

"연속된" 문자에 포인트를 둬서 생각해보았다. 연속된 문자는 하나로 보는것이었다. 이렇게 생각하면 연속과 비연속의 구분이 좀 더 간단해졌다. 바로 이후에 문자가 중복하여 나타나는가?의 유무로 연속과 비연속을 판단할 수 있는 것이다.

예를 들어 문제에서 예로 들어준 ccazzzzbb는 cazb로 축약하고 중복된 문자가 없으므로 그룹단어라 할 수 있다. 그리고 aabbbccb는 abcb로 축약하고 b가 중복되어 나타나므로 그룹단어라 할 수 없다.

이 개념으로 문제풀이를 하였다. 우선 basket이란 빈 리스트를 초기화하고, 반복될때마다 clear메소드로 이전값들을 지워준다. 그리고 문자열을 입력받아 문자열의 문자를 하나씩 순회한다.

문자가 중복되어 나타난 경우를 처리하기 위해, 먼저 순회하는 값이 basket에 존재하지 않으면 basket에 추가했다. 그리고 "첫 번째"로 만나는 인덱스넘버를 반환하는 index메소드를 활용했다. 중복되는 문자를 순회할 때, index로 반환하는 값과 리스트의 크기는 같지 않을 것이다.

aabbbccb로 예를 든다면, aabbbcc까지는 값을 순회하며 index값을 반환한 값과 basket의 크기가 같을 것이다.(잘 와닿지 않는다면 직접 하나씩 순회해서 보면 이해에 도움이 될 것이다.) 그러나 이후 b가 중복하여 나타나는 순간 index로 반환하는 값과 basket의 크기가 달라진다.(리스트 basket에는 a,b,c가 존재, b의 인덱스 1+1=2, basket의 크기 3) 이 점을 이용하여 문제를 풀었다.

문제를 풀었던 시점과 지금 이 글을 작성하는 시점이 차이가 난다. 이제와서 보니 중복을 처리하는 부분이 아쉽다는 생각이 든다. 좀 더 직관적으로 처리할 수는 없었나하는 아쉬움이 든다.

번외) 글 작성하는것이 어렵다.. 설명하는 글의 가독성이 그다지 좋아보이진 않는다. 이 부분도 조금씩 고쳐 나가야겠다.

좋은 웹페이지 즐겨찾기