https://school.programmers.co.kr/learn/courses/30/lessons/42860
[풀이]
AAA -> JAZ 로 만들기 위해서는
- "▲ 커서" 9번 조작 : A→"J"
- "◀ 커서" 1번 조작 : 맨 뒤의 문자로 커서 이동
- "▼ 커서" 1번 조작 : A→"Z"
총 11번 이동으로 만들 수 있다.
💡 고려 사항
1️⃣ 상하 이동 ▲ or ▼
알파벳의 아스키 코드를 이용해서 13번째 값인 N 을 기준으로 짧은 이동 구한다
for(let i = 0; i < name.length; i++){ answer += Math.min(name.charCodeAt(i) - 'A'.charCodeAt(0), 'Z'.charCodeAt(0) - name.charCodeAt(i) + 1);
2️⃣ 다음 알파벳 이동 ▶ or ◀
순서대로 : ▶ 이동 -> index + 1
뒤로이동 : 현재 인덱스 대비 맨앞의 인덱스부터 앞뒤로 2번 가야하니 (현재 인덱스*2)
연속되는 'A' 의 개수 : 만약 다음 인덱스의 알파벳이 'A' 라면 다음 인덱스 변경이 불필요하므로 index + 1
index = i + 1; // 다음 값들을 확인할 때 무조건 커서 움직여야 하기 때문에 // 연속되는 A 갯수 확인 while(index < length && name.charAt(index) === 'A'){ index++; }
3️⃣ 최소의 이동수 구한다.
연속된 A의 앞쪽보다 뒤쪽이 짧은경우 -> 뒤쪽부터 조작하는 것이 더 적은 이동횟수 일 수 있으므로
처음부터 뒷 부분을 먼저 입력하는 것이 더 빠른 경우까지 고려(length - index) * 2 + i)
[코드]
테스트 케이스 하나 만들어보자 "BBBBAAAAAAAB"
처음 문자 (default: A) | A | A | A | A | A | A | A | A | A | A |
키보드 조작 | 1️⃣ "◀ 커서" 1번 조작 : 맨 뒤의 문자로 커서 이동 3️⃣ "▲커서"1번조작 "▶커서"1번조작 |
4️⃣ "▲커서"1번조작 "▶커서"1번조작 |
5️⃣ "▲커서"1번조작 "▶커서"1번조작 |
6️⃣ "▲커서"1번조작 |
조작필요X | 조작필요X | 조작필요X | 조작필요X | 조작필요X | 2️⃣ "▲커서"1번조작 "▶커서"1번조작 |
변경된 문자 | B | B | B | B | A | A | A | A | A | B |
해당케이스는 뒷부분부터 먼저간 다음 입력하는 것이 더 효율적
조작횟수 : 3 + 2+ 2+ 1+ 2 = 10
[코드]
function solution(name) {
let answer = 0;
const length = name.length;
let index; // 다음 값들을 확인할 때 사용
let moveCount = length - 1; // 좌우 움직임 수를 체크
for(let i = 0; i < name.length; i++){
answer += Math.min(name.charCodeAt(i) - 'A'.charCodeAt(0), 'Z'.charCodeAt(0) - name.charCodeAt(i) + 1);
index = i + 1; // 다음 값들을 확인할 때 무조건 커서 움직여야 하기 때문에
// 연속되는 A 갯수 확인
while(index < length && name.charAt(index) === 'A'){
index++;
}
// 순서대로 가는 것과, 뒤로 돌아가는 것 중 이동수가 적은 것을 선택
moveCount = Math.min(moveCount, i * 2 + length - index);
// 2022년 이전 테스트 케이스만 확인하면 여기까지해도 정답처리가 되기 때문에, 이전 정답들에는 여기까지만 정리되어 있지만,
// BBBBAAAAAAAB 와 같이, 처음부터 뒷부분을 먼저 입력하는 것이 더 빠른 경우까지 고려하려면 아래의 코드가 필요합니다.
moveCount = Math.min(moveCount, (length - index) * 2 + i);
}
return answer + moveCount; //6+4
}
// 테스트
console.log(solution("JEROEN")); // 56
console.log(solution("JAN")); // 23
console.log(solution("BCAABD")); // 11
console.log(solution("BBBBAAAAAAAB")); //10
참고 :
string.charCodeAt(index) : index에 해당하는 문자의 unicode 값을 리턴
'A'.charCodeAt(0) = 65 // A의 아스키코드는 65이다
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt
https://opentutorials.org/course/50/87
728x90
반응형
'자료구조+알고리즘 > Programmers' 카테고리의 다른 글
[프로그래머스 level03] 순위 - javascript (0) | 2024.03.31 |
---|---|
[프로그래머스-level2] 게임 맵 최단거리 - javascript (0) | 2024.03.26 |
[프로그래머스-level2] 기능개발 (javascript) (0) | 2024.03.15 |
[프로그래머스_lv2] 타겟 넘버 (javascript) (0) | 2024.03.08 |
[프로그래머스_Lv.1] 바탕화면 정리 (javascript) (0) | 2024.02.27 |