메모/알고리즘

[백준] Python - 그룹 단어 체커

Floodnut 2021. 9. 9. 20:51
 

1316번: 그룹 단어 체커

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

www.acmicpc.net

 

그룹 단어 체커 문제이다.

1개 이상의 같은 알파벳끼리는 모여있어야한다. 

 

ex)

abcdddd -> a, b, c, d가 각각 모여있으니 그룹 단어.

abababc -> a, b가 자기 끼리 모여있지 않으니 그룹 단어가 아님.

 

파이썬을 활용했고 다른 더 좋은 알고리즘이 충분히 존재할 수 있다.

나는 인덱스 0부터 문자열의 끝 인덱스까지 탐색하며 현재 위치의 알파벳의 인덱스를 딕셔너리에 저장했다.

그리고 다른 인덱스를 검증할 때 기존에 저장했던 인덱스라면 딕셔너리에 그 위치(인덱스 번호)가 저장되 있을 것이고 그 위치의 차이를 확인하는 방식으로 했다.

 

다른 알고리즘으로는 마지막 위치를 저장하는 것이 아닌 단순하게 사용된 단어라면 1 아니라면 0을 저장하는 식으로 했어도 됬을 것이다.

(친구 아이디어)

 

소스 코드는 아래 확인.

 

더보기
#https://github.com/CASPER-REPSAC/algorithm-stack/blob/gsniper777/baekjoon/1316

import sys

wordCounts = int(input())
groupcount = 0
words = []
wordsLastPos = {} #문자열의 특정 문자의 마지막 위치를 저장할 딕셔너리
def cmpPosition(words): 
    for i in range(len(words)): #문자열을 첫 단어부터 끝 단어까지 
        if((wordsLastPos.get(words[i]) == None) or ((i-wordsLastPos[words[i]]) == 1) ):
            wordsLastPos[words[i]] = i #딕셔너리에 처음 저장되는 단어거나 연속된 단어일 경우 딕셔너리 갱신
        elif( (i - wordsLastPos[words[i]]) > 1 ): 
            return 0   #연속되지 않는 단어일 경우 0 리턴        
    return 1 #문자열의 끝까지 0이 리턴되지 않고 정상적으로 탐색했다면 1 리턴

for repeat in range(wordCounts):
    a = sys.stdin.readline().strip()
    words.append(a)

for repeat in words:
    if(cmpPosition(repeat) == 1):
        groupcount += 1 #정상적 리턴(1)마다 1씩 증가
    wordsLastPos = {}

print(groupcount)