본문 바로가기
Problem Solving/BOJ

[BOJ][Python]18238 풀이

by NoiB 2023. 1. 17.
반응형

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

 

18238번: ZOAC 2

2019년 12월, 두 번째로 개최된 ZOAC의 오프닝을 맡은 성우는 누구보다 화려하게 ZOAC를 알리려 한다. 작년 ZOAC의 방식은 너무 식상하다고 생각한 성우는 문자열을 보여주는 새로운 규칙을 고안해

www.acmicpc.net

from string import ascii_uppercase

uppers = list(ascii_uppercase)
s = input()
ans = 0
start = 'A'
for i in s:
    start_idx = uppers.index(start)
    next_idx = uppers.index(i)
    if next_idx > start_idx:
        ans += min((next_idx - start_idx), (start_idx + 26 - next_idx))
    else:
        ans += min((start_idx - next_idx), (next_idx + 26 - start_idx))
    start = i
print(ans)

좀 더 최적화할만한 방법이 있을 것으로 생각하는 코드입니다. 이 문제의 경우 그렇게 입력이 길지 않고 시간 제한도 넉넉하기 때문에 단순 반복문에 두가지 방법의 최솟값을 구하는 방식으로 하면 충분히 풀릴 것이라 생각하고 그런 방향으로 코드를 작성했습니다.

 

저는 리스트 인덱스를 사용해서 문제를 계산하면 편할 것 같다고 생각이 들어서 알파벳 대문자를 원소로 가지는 리스트를 만들어줬습니다. 그리고 input을 순서대로 탐색하면서 다음으로 이동해야할 인덱스와 현재 인덱스의 차를 ans 라는 변수에 차례차례 더해주는 방식으로 코드를 작성했습니다. 또한 start_idx와 next_idx의 대소관계에 따라 차이를 계산하는 방식이 달라지기 때문에 조건문을 사용해서 분할해줬습니다(쓰다가 문득 든 생각인데 절댓값을 사용해서 계산하도록 하면 조건문이 없어도 될 것 같습니다).

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]18096 풀이  (0) 2023.01.25
[BOJ][Python]2810 풀이  (0) 2023.01.23
[BOJ][Python]22864 풀이  (0) 2022.12.31
[BOJ][Python]14487 풀이  (0) 2022.12.30