본문 바로가기

백준 write-up/정렬 & 그리디

[백준] ZOAC 2 : 18238번 - Python

728x90
반응형

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

 

18238번: ZOAC 2

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

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

[Python] ord 함수

: 하나의 문자를 인자로 받고 해당 문자에 해당하는 유니코드 정수를 반환하는 함수이다.

ex) ord('a') 를 넣으면 정수 97을 반환. / ord('A')를 넣으면 65 반환.

 

[Python] chr 함수

: 하나의 정수를 인자로 받고 해당 정수에 해당하는 유니코드 문자를 반환하는 함수이다.

ex) chr(97)을 하면 문자 'a'를 반환한다.

 

 

 

문제의 접근 방법

 

- 문자들만 가지고는 몇 만큼 차이가 나는지 계산하기 어려우므로 아스키 코드를 사용해서 입력 받은 문자를 숫자로 바꿔서 계산하기

- 알파벳은 총 26개

- 원판이 왼쪽으로 도는 경우와 오른쪽을 도는 경우 중 더 짧은 쪽을 선택하기

 

 

 

내가 막혔던 부분

 

- 아스키 코드를 다뤄본 적이 없어서 초기 접근에 어려움을 겪었다.

 

 

 

문제 풀이 방법

 

(1) 문자열 string을 리스트 형태로 입력받기

 

(2) 처음 순간에 화살표는 'A'를 가리키고 있기 때문에 초기 값 first를 'A'로 설정해두기

 

(3) 리스트 string안에서 i번째 문자열을 아스키 코드 값으로 나타낸 것에서 'A'의 아스키 코드 값을 빼주기 -> 왼쪽으로 돌려야 하는 경우

'A'의 아스키 코드 값에서 i번째 문자열을 아스키 코드 값으로 나타낸 것을 배주기 -> 오른쪽으로 돌려야 하는 경우

 

(4) 만약 left(왼쪽으로 돌려야 하는 경우)값이 0보다 작다면 알파벳의 개수가 총 26개이므로 +26을 해준다.

ex) left가 -25라면 0보다 작기 때문에 +26을 해주면 결과는 1이다. 즉 한 칸만 왼쪽으로 돌리면 된다는 뜻!

 

(5) 만약 right(오른쪽으로 돌려야 하는 경우)값이 0보다 작다면 (4)의 과정과 같은 이유로 +26을 해준다.

 

(6) 이 값들 중(left, right) 더 작은 값이 문자열을 출력하는 데 걸리는 최소 시간이므로 변수 count에 누적해서 더해준다.

 

(7) 리스트 string에서 i번째와 그 다음 요소의 거리를 계산해야 하므로 초기에 'A'로 설정되어 있던 first를 i 값으로 바꿔준다.

 

(8) 해당 문자열을 출력하는 데 걸리는 시간의 최솟값 count를 출력해준다!

 

 

 

소스코드

string = list(input())

count = 0
first = 'A'

for i in string:
    left = ord(i) - ord(first)
    right = ord(first) - ord(i)

    if left < 0:
        left += 26
    elif right < 0:
        right += 26
    
    count += min(left, right)
    first = i

print(count)
728x90
반응형