https://www.acmicpc.net/problem/18238
문제를 풀면서 몰랐던 개념
[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)
'백준 write-up > 정렬 & 그리디' 카테고리의 다른 글
[백준] 토너먼트 만들기 : 2262번 - Python (0) | 2021.08.21 |
---|---|
[백준] 슬라임 합치기 : 14241번 - Python (0) | 2021.08.21 |
[백준] 라디오 : 3135번 - Python (0) | 2021.08.18 |
[백준] 삼각형 만들기 : 1448번 - Python (0) | 2021.08.18 |
[백준] 카드 문자열 : 13417번 - Python (0) | 2021.08.18 |