자기계발
백준
2941 · 크로아티아 알파벳

백준 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를 쓸 때는 치환 순서와 치환 뒤 글자가 붙는 경우를 함께 고려해야 한다.

출처