1일 1솔

[백준] 18238번: ZOAC 2 (Python, 파이썬)

junmukbap98 2023. 9. 7. 22:27

문제 링크: https://www.acmicpc.net/problem/18238

 

18238번: ZOAC 2

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

www.acmicpc.net

 

이 문제 푸는데 좀 오래 걸렸다.

 

아래 그림에서 말하는 큰 알파벳은 알파벳 순서에서 더 뒤에 있는 것을 말한다. 

즉, 'A' -> 'Z'로 갈 수록 큰 알파벳이라고 생각하면 된다.

 

나는 현재 문자와 다음 문자의 아스키 코드를 비교해서, 

min(큰 아스키 코드 - 작은 아스키 코드, 작은 아스키 코드 - 큰 아스키 코드 + 26) 둘 중에 최소값을 계속 누적하는 식으로 문제를 풀었다. 

a = list(input())
res = 0

# 처음에 'A'부터 시작
res = min(ord(a[0])-ord('A'), ord('A')-ord(a[0])+26)


for i in range(len(a)-1):
    if ord(a[i])>ord(a[i+1]):
        big = ord(a[i])
        small = ord(a[i+1])
    
    else:
        big = ord(a[i+1])
        small = ord(a[i])

    t = min(abs(small - big + 26), abs(big-small))
    res += t
    
print(res)

어째 풀긴 풀었는데 뭔가 최적은 아닌 것 같아서, 다른 사람이 작성한 코드를 보니.. 그게 좀 더 직관적인 것 같다. 

a = list(input())
start = 'A'
t = 0

for i in a:
    x = ord(i) - ord(start) # 현재 - 이전 알파벳
    y = ord(start) - ord(i) # 이전 - 현재 알파벳

    if x < 0: 
        x += 26 
    elif y < 0: 
        y += 26

    t += min(x, y)
    start = i

print(t)