https://www.acmicpc.net/problem/1316
문제
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.
출력
첫째 줄에 그룹 단어의 개수를 출력한다.
예제 입력
4
aba
abab
abcabc
a
예제 출력
1
풀이
n = int(input())
cnt = 0 # 그룹 단어의 갯수
for _ in range(n):
word = input()
checked = []
tmp = ""
is_group = True
for w in word:
if w in checked:
if tmp != w:
is_group = False
break
else:
checked.append(w)
tmp = w
if is_group:
cnt += 1
print(cnt)
n만큼 반복문을 돌 때마다 word를 입력받고 바로 그룹 단어인지 체크한다. 이미 한 번 지나간 문자는 checked에 저장하고, tmp는 현재 지나가는 문자를 의미한다. is_group은 입력받은 단어 word가 그룹단어인지 확인하는 변수이다.
word의 각 문자들을 하나씩 확인하면서 문자가 checked에 이미 있는 경우, 현재 확인하는 문자가 tmp와 같다면 현재 문자가 연속해서 나타나는 경우이기 때문에 따로 처리해주지 않아도 된다.
하지만 현재 확인하는 문자가 checked에 있지만 tmp와 다르다면 앞에서 이미 한 번 등장했다가 지나간 문자라는 의미이기 때문에 이 경우에는 그룹단어가 아니게 된다. 따라서 is_group을 False로 바꿔준 후 for문을 빠져나온다.
w가 checked에 없을 경우(처음으로 등장한 문자일 경우) checked에 w을 추가해준 후, tmp를 w로 바꿔준다.
다른 풀이
다른 분들의 풀이를 검색해보다가 찾은 방법. 좀 더 간단한 것 같다.
n = int(input())
cnt = n # 그룹 단어의 갯수
for _ in range(n):
word = input()
for i in range(len(word) - 1):
if word[i] == word[i + 1]:
pass
elif word[i] in word[i + 1:]:
cnt -= 1
break
print(cnt)
내가 풀었던 코드와 다른 점은 일단 그룹 단어의 갯수를 처음에 0으로 초기화하지 않고 n으로 초기화하고 조건에 맞지 않을 경우 하나씩 빼줬다는 점이다.
word의 길이 -1 만큼 for문을 돌면서(조건문에서 i+1번째 인덱스까지 확인하기 때문) 먼저 word[i]와 word[i+1]일 경우를 먼저 체크해준다. 그렇지 않고 word[i]가 word[i+1:]안에 있을 경우를 확인한다.
이 경우 word[i] != word[i+1]인데 i+1부터 그 뒤의 문자중에 word[i]가 또 등장한다는 의미이므로 그룹단어가 아니다.
따라서 cnt를 -1해준 후 break해준다.
'Algorithm > Problem Solving' 카테고리의 다른 글
[Python] 백준/BOJ - 5622번: 다이얼 (0) | 2022.03.24 |
---|---|
[Python] 백준/BOJ - 11721번: 열 개씩 끊어 출력하기 (0) | 2022.03.24 |
[Python] LeetCode - 841. Keys and Rooms (0) | 2021.12.08 |
[Python] 백준/BOJ - 2839번: 설탕 배달 (0) | 2021.12.02 |
[Python] 백준/BOJ - 4796번: 캠핑 (0) | 2021.12.01 |