본문 바로가기

자료구조+알고리즘/Programmers

[프로그래머스-level2] 조이스틱 - javascript

https://school.programmers.co.kr/learn/courses/30/lessons/42860

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

[풀이]

 

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

 

String.prototype.charCodeAt() - JavaScript | MDN

The charCodeAt() method of String values returns an integer between 0 and 65535 representing the UTF-16 code unit at the given index.

developer.mozilla.org

https://opentutorials.org/course/50/87

 

charCodeAt - 생활코딩

요약 index에 해당하는 문자의 unicode 값을 리턴 문법 string.charCodeAt(index) 인자 index - 필수, 0보다 큰 정수 설명 유니코드는 모든 시스템에서 일관되게 문자를 표현하기 위한 산업표준이다. charCodeAt

opentutorials.org

 

728x90
반응형