문제 설명
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동 (마지막 위치에서 오른쪽으로 이동하면 첫 번째 문자에 커서)
예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다. - 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다. - 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다. 따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다. 만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.제한 사항name은 알파벳 대문자로만 이루어져 있습니다.name의 길이는 1 이상 20 이하입니다.
해설
위처럼 리스트 안에 문자열을 넣어두고 앞에서 셀때 뒤에서 셀때를 비교하는 방식으로 생각했다.
근데 조금 뭔가 이상한게 있는데 뭐가 틀린지 몰라서 고민하다가 다른 사람 풀이를 봤다.
접근 방법은 같았다.
근데 ord로 문자열에 부여된 숫자를 빼서 절대값으로 만든다음 최소값을 리턴하게 한다.
이렇게 하면 깔끔하다는 것을 깨달았다.
왼쪽으로(거꾸로) 먼저 탐색 후 뒤돌아와서 탐색하는 경우랑 기본(length-1)을 비교해서 그중에 가장 작은 값을 저장하는 방식
여기서 뒤에서 셀 때 -1을 안해줘서 조금씩 크게 나오는 것이었다.
*ord 사용하는 이유
'A'의 ASCII 값과 문자열에 있는 각 문자의 ASCII 값 간의 절대 차이를 계산합니다. 이 차이가 'A'의 아스키 값과 알파벳 역순 등가 문자의 아스키 값의 차이보다 크면 후자의 차이를 대신 계산합니다. 마지막으로 각 문자를 변경하는 데 필요한 모든 최소 단계를 합산하여 "answer" 변수에 저장한다.
다음으로 "min_move" 변수를 "len(name) - 1"의 가능한 최대 값으로 초기화합니다.
이는 전체 문자열이 이미 'A'로 구성된 엣지 케이스를 처리하기 위해 수행한다.
그런 다음 문자열의 각 문자를 반복하고 인덱스 "i"를 추적합니다. 문자열에서 'A'가 아닌 다음 문자의 인덱스 "next_i"를 계산합니다. 그런 다음 현재 커서 위치에서 이 문자로 커서를 이동하는 데 필요한 최소 단계 수를 계산합니다.
이는 현재 커서 위치에서 다음 비'A' 문자까지 그리고 문자열의 끝에서 다음 비'A' 문자까지 양방향으로 다음 'A'가 아닌 문자에 도달하는 데 필요한 단계 수를 확인하여 수행됩니다.
'A'가 아닌 문자. 마지막으로 "min_move"의 값을 현재 값의 최소값과 문자를 변경하는 동안 문자열의 마지막 문자에 도달하는 데 필요한 최소 단계 수로 업데이트합니다.
마지막으로 이 함수는 "answer"와 "min_move"의 합을 반환하여 변경하는 동안 문자열의 마지막 문자에 도달하는 데 필요한 최소 단계 수를 제공합니다
역시 그리디는 정렬 문제라고 보는게 맞는것 같다.
정렬을 하고 나서 어떻게 풀지 생각을 하는거니까...
'코테공부' 카테고리의 다른 글
프로그래머스 49일차 - 구명보트 (0) | 2023.04.06 |
---|---|
프로그래머스 49일차 - 큰 수 만들기 (0) | 2023.04.06 |
프로그래머스 48일차 - 더 맵게 (0) | 2023.04.05 |
프로그래머스 48일차 - n^2 배열 자르기 (0) | 2023.04.05 |
프로그래머스 48일차 - 호텔 대실 (0) | 2023.04.05 |