알고리즘

백준 1316 그룹 단어 체커 파이썬 풀이

물에빠진사람 2024. 1. 16. 21:32
반응형

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

 

접근법

알파벳 배열을 만들어서 단어를 훑는 방법을 생각했다.

단어를 입력받아서 배열로 할당을 한다. 같은 단어인지를 flag(깃발)을 통해 같은 그룹이면 1, 아니면 0으로 한다.  마지막에 깃발이 1이면 count를 증가시킨다. 

 

코드

n = int(input())
count = 0
for _ in range(n) :
    alphabet = [0] * 27
    word = [x for x in input()]
    flag = 1
    prev_letter = word[0]
    alphabet[ord(word[0]) - 97] = 1
    if len(word) == 1 :
        count += 1
        continue
    for i in range(1, len(word)) :
        if alphabet[ord(word[i]) - 97] == 0:
            alphabet[ord(word[i]) - 97] = 1
            prev_letter = word[i]
        elif prev_letter != word[i] :
            flag = 0
            break
    if flag :
        count += 1
print(count)

 

 

입력받은 단어를 알파벳으로 변환해서 리스트를 채우고 첫 인덱스의 알파벳을 prev_letter라는 변수에 첫 알파벳으로 지정을 했다. 이 알파벳을 기준으로 하나씩 인덱스를 옮겨가며 같은 단어인지 확인을 할 것이다. 

 

중복 등장하는 단어인지는 아스키코드로 인덱스에 접근해서 확인한다. 아스키코드로 a는 97에 해당된다. 그렇기때문에 ord()함수로 아스키코드 변환 후, 97을빼주면 0~26인덱스로 관리가 가능해진다.

 

 

사실 기본적인 문제인데 이상하게 코드를 짜지 짜는데 실수를 많이해서 오래 걸렸다. prev_letter도 지정안하고, 아스키코드에서 97빼주는걸 까먹어서 list out of index도 뜨고 while반복문 쓰다가 무한루프에도 빠지고.. 여러모로 지치는 문제였다.

반응형