nan + nan = 2nan

[백준][Python3] #2941. 크로아티아 알파벳 본문

Python/백준 알고리즘

[백준][Python3] #2941. 크로아티아 알파벳

2nan 2023. 1. 16. 19:30
728x90

 


코드 입력

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)

 

해당 문제의 경우, 시간이 좀 걸렸다.

처음에는 그냥 크로아티아 알파벳을 전부 리스트에 넣고 for문을 돌리면서 걸리면 replace로 하나씩 빼면 되지 않을까,라고 생각했는데 오산이었다.왜냐면 중복한 알파벳이 있을 경우 replace로 바꾼다면 중복값이 1개로 대체될 뿐더러, 알파벳이 중간에 있는 경우에도대체를 해버려 의미가 달라질 경우가 있기 때문이었다.

# 중복값 문제

test = 'ddz=z='

test = test.replace('z=', '')

## test는 'dd'


# 중간에서 변환 문제

test = 'ddz=z='

test = test.replace('dz=', '')

## test는 'dz=', 본래 의미와 달라질 수 있음. 글자는 앞에서부터 읽어야 하기 때문

 

그래서 while문을 이용해 글자를 앞에서부터 탐색하면서 가장 긴 알파벳을 우선적으로 검사하고, 

그 다음은 리스트의 2글자짜리를 검사하고, 그것도 없다면 한 글자로 인식하여 지우면서 count를 하는 로직이다.

나중에 replace를 쓸 때도 이런 점들을 고려해서 사용해야겠다.


출처 : 백준 Online Judge

https://www.acmicpc.net/problem/2941

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

 

Comments