우선 아래 풀이에 앞서, ord 함수를 소개하고자 한다.
print(ord('A'))
위 결과 값으로는 65가 나오고 ord 함수는 character 의 ASCII code 값을 반환하는 함수이다. 나는 이 함수를 몰랐기에.... 아래 코드 처럼 panix 라는 dictionary 를 정의해서 풀었다 :(
이 문제를 풀 때는 오른쪽 왼쪽으로 움직이는 횟수와 위 아래로 움직이는 횟수를 분리해서 풀었다.
- 위 아래로 움직이는 문제는 해당 알파벳을 숫자로 변환한 후 Z 에서 내려가는 것과 A 에서 올라가는 것 중에 어느 것이 더 가까운지 비교해서 더하는 것으로 계산했다.
- 오른쪽 왼쪽으로 움직이는 횟수는 처음에 그냥 오른쪽으로 갔을 때와 왼쪽으로 갔을 때를 비교해서 더 적은 횟수를 기준으로 계산했지만 큰 오류가 존재했다.
바로 아래와 같은 경우이다.
"ABABAAAAAAABA"
이러한 경우에는 왼쪽으로 2번 갔다가 다시 돌아와서 오른쪽으로 4번 가는 것 즉, 총 8번 움직이는 것이 가장 빠른 루트이다.
이러한 부분까지 고려해야 했으므로 zig_zag 라는 list 를 만들어 A 가 아닌 요소 중 하나씩 선택하여 zig_zag 해서 접근해보았다. 그리고 그 중에서 가장 최소가 되는 값을 뽑아서 왼쪽으로만 갔을 경우와 오른쪽으로만 갔을 경우와 비교했다.
panix = {'A':1, 'B':2, 'C':3, 'D':4, 'E':5, 'F':6, 'G':7, 'H':8, 'I':9, 'J':10, 'K':11, 'L':12, 'M':13, \
'N':14, 'O':15, 'P':16, 'Q':17, 'R':18, 'S':19, 'T':20, 'U':21, 'V':22, 'W':23, 'X':24, 'Y':25, 'Z':26}
def solution(name):
location = []
rev_location = []
zig_zag_location = []
total = 0
for i in range(len(name)):
if(name[i] != 'A'):
seq = panix[name[i]]
total += min(seq-1, 27-seq)
location.append(i)
rev_location.append(len(name)-i)
for i in range(len(location)-1):
temp = 0
temp += location[i]*2
temp += max(rev_location[i+1:])
zig_zag_location.append(temp)
total += min(max(location), max(rev_location), min(zig_zag_location))
return total
'알고리즘' 카테고리의 다른 글
[웅's 프로그래머스] N으로 표현 - 파이썬(python) 풀이 (0) | 2021.09.22 |
---|---|
[웅's 프로그래머스] 체육복 - 파이썬(python) 풀이 (0) | 2021.09.22 |
[웅's 프로그래머스] 큰 수 만들기 - 파이썬(python) 풀이 (0) | 2021.09.22 |
[웅's 프로그래머스] 단속카메라 - 파이썬(python) 풀이 (0) | 2021.09.22 |
[웅's 프로그래머스] 섬 연결하기 - 파이썬(Python) 풀이 (0) | 2021.09.22 |