Back/Algorithm

백준 알고리즘 1316 그룹단어 체크 파이썬

백준 알고리즘 1316 그룹단어 체크 파이썬

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

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net


처음에 이렇게 삽질했다...

# 단어 갯수 입력값
n = int(input())

#입력받은 단어 리스트
words = []

# 개수 저장
counter = 0
check_list = []
check = True

# n의 수만큼 단어 입력값
for i in range(n):
    word = list(input())
    words.append(word)


a = len(words)

for k in range(a):
    check = True
    if check == True:
        for j in range(a):
            #마지막 글자가 인덱스를 넘어가서 -1로 균형맞춰줌.
            #어차피 마지막은 비교할 일 없으니까
            if words[k][k] != words[k][j] and words[k][k] not in check_list:
                check_list.append(words[k][j])

            if words[k][k] != words[k][j] and words[k][k] in check_list:
                check = False
                continue
        if check == True:
              counter += 1


print(counter)

입력값으로 word를 하나하나 받아와서 words에 넣어주려고 했었고,

check를 blooen으로 만들어서 통과가 되면 +1씩 해주려 했는데,

단어 끝이 문제인건지 자꾸만 오류ㅠㅠ


수정

n = int(input())

words = 0

for _ in range(n):
    word = input()
    fail = 0
    for i in range(len(word)-1):
        if word[i] != word[i+1]:
            new_word = word[i+1:] 
            if new_word.count(word[i]) > 0:
                fail += 1
    if fail == 0:
        words += 1
print(words)

word를 for문만큼 입력시킨 다음에 빈 리스트에 넣어주는게 아니라

입력을 받을 때 마다 for문을 돌려서

 

해당 word의 범위만큼 인덱스를 생성하는데, 여기서 끝의 글자는 비교할 필요가없으니 -1 해준다.

 

그 후 word[i]와 word[i+1]을 비교해준다.

연속된 두 글자를 비교해서

만약 다르다면, 그 뒤에 같은 글자가 있는지 비교해야하니

 

new_word라고 word의 i+1부터 남은 모든 부분을 [i+1:] 해준 변수를 만든다.

 

그리고 만약 new_word에 처음 비교된 word[i]가 있다면 이건 실패한 거니 fail+1을 해주고,

 

다시 for문을 돌린다.

 

만약 fail이 한번도 일어나지 않았다면 성공적인 글자니 words에 1을 더해준다.

 

다시 for문의 처음으로 돌아와 word의 입력값을받고 fail을 0으로 초기화시킨다.