본문 바로가기
IT/알고리즘

[BAEKJOON] 백준 1316번: 그룹 단어 체커 (Python)

by 무녈 2021. 8. 19.

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net


문제

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

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

출력

첫째 줄에 그룹 단어의 개수를 출력한다.


코드 1 (예전 풀이)

num = int(input())
cnt = 0

for i in range(num):
    word = input()
    word_list = [word[0]]
    error = 0
    if len(word) == 1:
        cnt += 1
    else:
        for  j in range(1, len(word)):
            if word[j-1] != word[j]:
                word_list.append(word[j]) 
        
            if word[j] in word_list[:-1]:
                 error += 1

        if error == 0:
            cnt += 1
    
print(cnt)

코드 설명

  1. 단어가 입력되었을 때. 알파벳 순서 상관없이 단어 내에서 연속된 중복문자는 허용되나, 다른 중복 문자는 허용하지 않는 단어만 찾는 문제이다. 이문제를 처음 보았을 때는 위와 같이 코드 1의 방식으로 문제를 풀었었다.
  2. 입력될 단어의 개수를 입력받는 변수 num과 알맞은 단어들을 세기위한 cnt 변수를 설정한다.
  3. 입력될 단어의 개수만큼 입력받기 위해 for문을 이용하여, 단어들을 입력받는다.
  4. 첫 번째 알파벳은 무조건 비교대상이기 때문에 입력받은 단어의 첫 번째 원소를 word_list라는 새로운 배열로 만든다.
  5. 중복문자 check를 확인하기 위해 error 변수를 설정하고, 만약 단어의 기링가 1일 때는 중복문자가 존재하지 않으므로, cnt를 1 증가한다.
  6. 단어의 길이가 2 이상일 경우, 1부터 단어의 길이-1까지 for문을 순회하며, 입력받은 단어의 인덱스 원소가 연속된 중복문자가 아닐 경우, word_list 배열에 추가한다.
  7. 그리고 현재까지 추가된 word_list 배열의 마지막을 제외한 리스트 범위에 현재 인덱스 원소가 존재하는 지 확인하고, 존재할 경우 error를 1 상향한다.
  8. error가 발생하지 않은 경우, 연속되지 않은 중복 문자가 없는 것이므로 cnt를 1 상향한다.
  9. 출력

* 최근에 친구의 부탁으로 풀어본 것인데, 코드도 너무 장황하고, 오히려 설명하는 게 더 어려운 코드인 것 같아 다른 풀이를 보고 이해하였고, 오늘 다시 풀어보게 되었다.

코드 2

cnt = 0

for i in range(int(input())):
    word = input()
    if list(word) == sorted(word, key=word.find):
        cnt += 1

print(cnt)

코드 설명

  1. 단어가 입력되었을 때. 알파벳 순서 상관없이 단어 내에서 연속된 중복문자는 허용되나, 다른 중복 문자는 허용하지 않는 단어만 찾는 문제이다. 
  2. 지시사항에 부합하는 문자열을 카운트하기 위해 cnt 변수를 설정한다.
  3. 첫 번째 input으로 들어올 입력받을 문자의 개수만큼 for문을 순회하며, 문자열을 검증한다.
  4. word 변수를 통해 확인할 문자열을 입력는다.
  5. 입력받은 문자열을 list 함수를 통해 알파벳으로 리스트를 만든다.
  6. sorted 함수를 통해 입력받은 문자열 word를 정렬하되, 핵심인 key를 이용한다.
  7. sorted 함수에서 key 값을 기준으로 정렬을 실시, find 메소드를 이용하여 입력받은 문자열의 각 원소를 기준으로 정렬을 한다.
  8. 이 때 연속되지 않은 중복문자가 있을 경우 입력받은 문자열의 리스트와 결과가 달라지게 된다.
    [A, B, A] => [A, A, B]​
  9. 두 리스트를 비교하고, 일치할 경우, cnt를 1 상향하고 for문이 끝났을 때 cnt를 출력한다.
반응형

댓글