본문 바로가기
코딩 테스트/Python_백준

[백준/Python] 1316번 그룹 단어 체커 문제

by 모두의 케빈 2023. 3. 30.

■ 1316번 그룹 단어 체커 문제

 

출처: 백준 1316번 그룹 단어 체커

 

■ 코드 풀이

 

두 가지 풀이법을 공유드리겠습니다. 하나는 제가 풀었던 방식이고, 다른 하나는 조금 더 개선된 방식입니다. 소요 시간은 동일하지만, 코드 길이에서 차이가 있어서 실전에서는 개선 방식대로 푸는 것이 좋아 보입니다. 그러나 파이썬을 막 배우기 시작하신 분이시라면 스터디를 위해서 두 코드 모두 보시는 것을 추천드립니다.

 

먼저 첫 번째 코드입니다. 아이디어는 다음과 같습니다.

1) 입력받은 단어를 word라는 변수로 선언한다. 그리고 word를 list화한 word_list도 선언한다.

2) word에서 알파벳을 한 글자씩 꺼낸다. 꺼낸 알파벳을 활용하여 word_list에 해당 알파벳이 몇 번째 있는지 index를 구한다. index는 char_idx_list에 저장하고 해당 위치는 별표(*)로 값을 바꿔준다.

3) 동일한 알파벳에 대해 word_list에 해당 알파벳이 없을 때까지 모두 위의 2) 과정을 수행한다.

4) char_idx_list에서 index 간격이 1이라면 다음 단어에 대해 똑같이 진행한다. char_idx_list에서 간격이 1이 아니라면, 해당 단어는 그룹 단어가 아니라는 뜻이다. 따라서 해당 단어의 word_list의 첫 번째 자리에 느낌표(!)를 넣어주고 뒤의 알파벳에 대해서는 검증할 필요가 없으므로 반복문을 종료(break)하고 다음 단어에 대해 검사를 진행한다.

5) 이때, for 반복문은 word를 기준으로 동작하고 while 반복문은 word_list를 기준으로 동작하므로 마지막 단어에서 list의 index 범위를 초과하는 값이 입력될 수 있다. 작성된 코드 상, char_idx_list가 0일 때는 마지막 단어를 의미하므로 에러 방지를 위해 char_idx_list의 길이가 0이라면 반복문을 종료한다.

N = int(input())
counts = 0

for i in range(N):
    word = input()
    word_list = list(word)

    for char in word:
        char_idx_list = []

        while (char in word_list):
            char_idx = word_list.index(char)
            word_list[char_idx] = '*'
            char_idx_list.append(char_idx)

        if len(char_idx_list) == 0:
            continue
    
        if (char_idx_list[-1] - char_idx_list[0] + 1) == len(char_idx_list):
            continue
        else:
            word_list.insert(0,'!')
            break
    
    if word_list[0] != '!':
        counts += 1

print(counts)

 

두 번째 코드입니다. 아이디어는 다음과 같습니다.

1) 단어를 word에 입력받고 그룹 단어가 맞는지를 알려주는 group_word_bl_ 변수를 True로 선언한다.

2) 마지막 단어는 반복문을 진행하는 의미가 없으므로 단어 수 -1까지를 range 범위로 설정한다.

3) 0부터 단어수 -2까지의 index까지를 for 반복문을 돌며 연속되는 단어에 대해 같은지 여부를 검사한다.

4) 단어가 연속되지 않으면 break 하고 그룹 단어 여부를 False로 변경한다.

5) 그룹 단어가 True인 경우에는 count에 1을 더하고 최종적으로 count를 출력한다.

N=int(input())
count=0

for i in range(N):
    word = input()  
    group_word_bl_=True
    for j in range(len(word)-1):
        if word[j]!=word[j+1]:
            if word[j] in word[j+1:]:
                group_word_bl_=False
                break
    if group_word_bl_:
        count+=1
        
print(count)

댓글