Problem
https://www.acmicpc.net/problem/2941
Solution
code1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from string import ascii_lowercase
# 길이가 2인 알파벳 -> 1인 알파벳 순서로 저장
croatian_alpha = ['c=','c-','dz=','d-','lj','nj','s=','z='] + list(ascii_lowercase)
word = input()
res=0
for i in croatian_alpha:
if i in word:
res += (word.count(i)) # 입력된 단어에서 알파벳 카운팅
word = word.replace(i,'.') # 카운팅 마친 뒤 해당 알파벳을 '.'으로 변경
print(res)
code2
1
2
3
4
5
6
7
croatian_alpha = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
word = input()
for t in croatian_alpha:
word = word.replace(t, '.')
print(len(word))
Memo
이 문제를 해결하기 위해 리스트를 활용하였다. 리스트에는 길이가 2인 알파벳 부터 1인 알파벳 순으로 저장하였는데 그렇지 않으면 c나 d등의 일반 알파벳이 중복카운팅될 수 있기 때문이다. 처음에는 카운팅을 마친 알파벳을 strip 함수를 통해 제거했는데 끝부분만 제거가 되었다. strip함수는 왼쪽과 오른쪽 끝부분에만 적용되는 함수이기 때문이다.
따라서 replace함수를 replace(i,'')
형태로 사용하였는데 이번에 발생한 문제는 nljj
가 테스트케이스로 입력되었을 경우에 결과가 3이 아닌 2가 출력되는 것이었다. 확인해보니 처음 lj
를 카운트한 뒤에 제거하게 되면 nj
가 남게되어 다음번 카운트때 길이가 2인 nj
로 인식되어 한개로 카운트가 되어 발생한 문제였다. 이를 해결하기 위해 공백으로 바꾸는 대신 알파벳이 아닌 다른 문자로 바꾸어주었다.
code2는 다른 블로거의 풀이를 보다가 알게 된 방법인데 일반 알파벳은 따로 세지 않고 바꿔준 word 문자열의 길이를 세어서 확인하는 방법이다. 개수만 세면 되는 문제이기 때문이다.