백준 2941번 크로아티아 알파벳
문제
크로아티아 알파벳은 입력할 수 없어서 č는 c=, ć는 c-, dž는 dz=, đ는 d-, š는 s=, ž는 z=로 바꿔 쓰고, lj와 nj는 그대로 쓴다. 입력은 최대 100글자의 단어이며, 이 표기에 없는 알파벳은 한 글자씩 센다. 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. 예를 들어 ljes=njak은 6, ddz=z=은 3이다.
풀이
처음에는 크로아티아 알파벳을 리스트에 담고 for문으로 돌면서 replace로 지우면 되리라고 생각했다. 하지만 replace는 두 가지 문제가 있다.
# 순서 문제
test = 'ddz=z='
test = test.replace('z=', '')
## test는 'dd'
# 치환 뒤 글자가 붙는 문제
test = 'ddz=z='
test = test.replace('dz=', '')
## test는 'dz=', 본래 의미와 달라질 수 있음. 글자는 앞에서부터 읽어야 하기 때문z=를 먼저 지우면 dz=의 일부가 사라져 dz=를 한 글자로 세지 못한다. 반대로 dz=를 지우면 양옆의 글자가 붙어 새로운 조합이 생길 수 있다.
그래서 while문으로 단어를 앞에서부터 읽는다. 남은 글자가 3글자 이상이면 dz=를 먼저 확인하고, 아니면 두 글자짜리 표기가 리스트에 있는지 확인하고, 둘 다 아니면 한 글자로 센다. 한 번 센 만큼은 문자열에서 잘라 낸다.
test = input()
list_cro = ['c=', 'c-', 'd-', 'lj', 'nj', 's=', 'z=']
cnt = 0
while True:
if len(test) >= 4:
if test[:3] == 'dz=':
cnt += 1
test = test[3:]
elif test[:2] in list_cro:
cnt += 1
test = test[2:]
else:
cnt += 1
test = test[1:]
elif len(test) == 3:
if test == 'dz=':
cnt += 1
break
elif test[:2] in list_cro:
cnt += 1
test = test[2:]
else:
cnt += 1
test = test[1:]
elif len(test) == 2:
if test in list_cro:
cnt += 1
break
else:
cnt += 1
test = test[1:]
elif len(test) == 1:
cnt += 1
break
else:
break
print(cnt)짚고 갈 점
replace를 쓸 때는 치환 순서와 치환 뒤 글자가 붙는 경우를 함께 고려해야 한다.