728x90
반응형
백준 1316번 Python
https://www.acmicpc.net/problem/1316
문제
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다.
예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다.
둘째 줄부터 N개의 줄에 단어가 들어온다.
단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.
출력
첫째 줄에 그룹 단어의 개수를 출력한다.
반응형
풀이
import sys
input = sys.stdin.readline
N = int(input().rstrip())
ans = N
for _ in range(N):
word = input().rstrip()
pre = [word[0]]
tmp = word[0]
for c in word[1:]:
if c == tmp:
continue
if c not in pre:
pre.append(c)
tmp = c
else:
ans -= 1
break
print(ans)
728x90
이전의 문자를 tmp변수에 담아둠과 동시에 이전에 나온 기록을 pre 배열에 담아두었다.
단어의 알파벳을 하나씩 비교하며 답을 찾아내는 방식으로 문제를 해결했다.
(진하게 느껴지는 하드코딩의 냄새...)
for문을 돌려 문제가 없다면 ans 가 1씩 늘어나는 방향으로 코드를 작성하려는 생각었다.
하지만 해당 방법을 사용하려면 for 문에 flag와 같은 추가적인 boolean 타입 변수 등을 포함시켜야 했다.
코드가 지저분해지는 것이 싫다면 for else 와 같은 조금 구닥다리(?) 같은 문법을 사용해야하는데...
공식문서에서도 for else는 가독성을 위해 비추천하는 아주 안 좋은 방식이다.
그래서 ans 값을 N으로 초기화하고 역으로 빼는 방법으로 문제를 해결했다.
코드를 완성하고 통과는 했는데... 맘에 안 든다.
다른 사람 풀이가 궁금해서 찾아보았다.
if list(word) == sorted(word, key=word.find):
이런 식으로 비교하면 코드가 굉장히 간단하고 직관적이게 된다.
좋은 풀이이다.
역시 문제를 풀고 다른 분들이 어떻게 풀었는지 확인해보고 내 코드와 비교하는게 실력 향상에 좋다.
728x90
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 백준 15649번 Python (0) | 2025.01.07 |
---|---|
[BOJ] 백준 2441번 Python (0) | 2025.01.05 |
[BOJ] 백준 2525번 Python (1) | 2025.01.05 |
[BOJ] 백준 1793번 Python (3) | 2025.01.03 |
[BOJ] 백준 22252번 Python (0) | 2025.01.02 |