Python Programming/[BOJ ] Algorithm

[백준 BOJ] 2941번(크로아티아 알파벳) Python 풀이

간토끼 2023. 8. 11. 08:30
728x90

# 해당 포스팅은 이제 막 알고리즘 공부를 시작한 초보 수준에서 작성했음을 이해해주시고, 비난보다는 따뜻한 조언을 부탁드립니다.


안녕하십니까, 간토끼입니다.

오늘은 백준 2941번 (크로아티아 알파벳)에 대해 다뤄보겠습니다.

 

1. 문제 링크

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

 

2941번: 크로아티아 알파벳

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

www.acmicpc.net

크로아티아 알파벳이란 게 있나 봅니다.

아무튼 주어진 크로아티아 알파벳을 입력하기 위해 기존 알파벳을 변형해서 입력했었는데요.

그래서 주어진 문자열 중 크로아티아 알파벳이 몇 개인지 출력하는 문제입니다.

 

2. 접근 방법

다음과 같이 접근하였습니다.

사실 푼지 며칠 된 문제입니다. 그래서 꽤나 지저분하게 풀었었는데요.

처음엔 각 요구된 규칙들마다 문자열을 count하면서 어렵게 접근했었습니다.

그러다보니 시간 초과가 발생하더라고요.

그래서 이 문제는 다른 분의 아이디어를 참고했습니다.

바로 요구된 규칙을 만나면 특정 문자열(Ex. "*")로 바꿔주고, 이 특정 문자열의 개수를 세는 겁니다.

참 간단한데 ... 역시 사람은 머리를 안 쓰면 몸이 고생합니다.

 

3. 코드

# 크로아티아 알파벳

a = input()
# 특수문자는 -, =밖에 없음
# - ~ : c, d
# = ~ : c, dz, s, z
# lj, nj

a_len = len(a)
idx = 0
cnt = 0
while idx < a_len:
    if a[idx] == 'c':
        if idx == a_len-1:
            cnt += 1
            break
        elif a[idx+1]=='=' or a[idx+1]=='-':
            cnt += 1 #단어 개수 세기
            idx += 2
            continue
        else:
            cnt +=1
            idx +=1
            continue
    elif a[idx] == 'd':
        if idx == a_len-1:
            cnt += 1
            break
        elif a[idx+1]=='z':
            if a[idx+1+1]=='=':
                cnt += 1
                idx += 3
                continue
        elif a[idx+1]=='-':
            cnt += 1 #단어 개수 세기
            idx += 2
            continue
        else:
            cnt += 1
            idx += 1
            continue
    elif a[idx]=='s' or a[idx]=='z':
        if idx == a_len-1:
            cnt += 1
            break
        elif a[idx+1]=='=':
            cnt += 1
            idx += 2
            continue
        else:
            cnt += 1
            idx += 1
            continue
    elif a[idx]=='c' or a[idx]=='d':
        if idx == a_len-1:
            cnt += 1
            break
        elif a[idx+1]=='-':
            cnt += 1
            idx += 2
            continue
        else:
            cnt +=1
            idx +=1
            continue
    elif a[idx]=='l' or a[idx]=='n':
        if idx == a_len-1:
            cnt += 1
            break
        elif a[idx+1]=='j':
            cnt +=1
            idx +=2
            continue
        else:
            cnt+=1
            idx+=1
            continue
    else:
        cnt += 1
        idx += 1
        continue

        
print(cnt)

 

이건 시간초과가 발생한 제 허접한 코드이고요.

 

이건 참고한 코드입니다.

a = input()
croatia_a = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']

for i in croatia_a:
    a = a.replace(i, "*")

print(len(a))

굉장히 직관적인 아이디어입니다.

결국 크로아티아 알파벳이 몇 개인지 세면 되는 거니까 해당 규칙을 먼저 정의하고 해당 문자열이 있을시 바꿔주고 개수를 세면 되는 거죠.

지금 풀면 쉽게 풀겠는데, 이땐 알고리즘 입문 단계를 끝냈을 때라 ... 여러모로 아쉬운 문제였습니다.

 

감사합니다.

잘 읽으셨다면 게시글 하단에 ♡(좋아요) 눌러주시면 감사하겠습니다 :)

(구독이면 더욱 좋습니다 ^_^)

* 본 블로그는 학부생이 운영하는 블로그입니다.

따라서 포스팅에 학문적 오류가 있을 수 있으며, 이를 감안해서 봐주시면 감사하겠습니다.

 


- 간토끼(DataLabbit)

- B.A. in Economics, Data Science at University of Seoul

728x90