https://school.programmers.co.kr/learn/courses/30/lessons/42860?language=python3
아스키 코드를 확인해보면 다음과 같았다.
그럼 정렬을 해주고.. 그러면 되지않나?
근데 정렬해주기 전에 원래 위치는 기억을 해야할 것같고.. 그럼 복사를 해줘야할 것같고 ..
대문자 "A"의 아스키코드는 65란다.
"Z"는 90
그러면 65 ~ 77는 A에서 이동
90 ~ 78는 Z에서 이동이 좋을 듯
근데 65에서 뺀 리스트들로 만들어줬으니
0 ~ 12까지가 A에서 이동
13 ~ 25까지가 Z에서 이동하면 되려나
그러면 이제 얘네를 중심으로 한번 최소값을 구하면 되지않나?
같은 애들은 set으로 해주면 나중에 위치 찾을 때 힘드려나? 고민.. 위치는 enumerate를 써서 튜플로 저장하는게 더 좋은가??
그럼 dfs 나 bfs 느낌.. 혹은 최단 경로 느낌 나는데??
일단 위치 제외하고 대략 해봤다.
Z에서부터도 해야하니까 min 함수를 활용하는 법이 있었다. 잘 기억하는게 좋을듯
위치가 제일 어려운 듯
최소한으로 어떻게 이동하냐고 ..?
근데 이게 그리디가 맞냐..?????? 물음표만 가득
내가 기억하는 dfs의 기본형태는 이거
def dfs(graph, v, visited):
visited[v] = True
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
음... 사용할 수 있나? graph 형태가 이게 아닌 듯 하다. 일단 위치를 왼쪽갔다가 오른쪽 갔다가 해야하는 기준은 A가 얼마나 많이 있느냐의 차이일 것같은데 JAZ같은 경우는 3글자에서 딱 정가운데에 있으니까 왼쪽 오른쪽만 채우면 되니 처음에서 ~ 끝으로 이렇게 이동하는 건데..
결국 구글링의 힘을 빌려서 코드를 바꿔보았다.
def solution(name):
answer = 0
alph = [ min(ord(n) - ord("A"), ord("Z") - ord(n) + 1) for n in name]
idx = 0 # start = 0
while True:
answer += alph[idx]
alph[idx] = 0
if sum(alph) == 0:
break
left, right = 1, 1
# 왼쪽으로 가니까 -
while alph[idx - left] == 0:
left += 1
# 오른쪽으로 가니까 +
while alph[idx + right] == 0:
right += 1
# left가 최소면 left를 더하고, right가 최소면 right 더하기
answer += left if left < right else right
# 그다음 idx 계산하기
idx += -left if left < right else right
return answer
그런데 100점이 안나왔다. 아무래도 테스트케이스가 추가되어서 그런것같은데..
이게 레벨 2라고..^^? 일단 보류해놓기.. 꼭 수욜전까진 해놓는다