새소식

알고리즘 테스트 ⏲/프로그래머스

[KAKAO INTERNSHIP] 키패드 누르기 풀이 / JavaScript

  • -
 

프로그래머스

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

programmers.co.kr

 

작성 코드 (1차 시도 / 통과)

function solution(numbers, hand) { const l = [1, 4, 7, -3] // * -> -3 const m = [2, 5, 8, -2] // 0 -> -2 const r = [3, 6, 9, -1] // # -> -1 let lh = -3 // * let rh = -1 // # let result = "" for (let v of numbers) { if (v === 0) v = -2 if (l.includes(v)) { // 1,4,7인 경우 result += "L" lh = v } else if (r.includes(v)) { // 3,6,9인 경우 result += "R" rh = v } else { // 2,5,8,-2인 경우 let lDist = 0; let rDist = 0; if (l.includes(lh)) { // 왼쪽손이 좌측인 경우 lDist = Math.abs(m.indexOf(lh + 1) - m.indexOf(v)) + 1 // 가운데로 이동 후 목표와의 거리 계산 } else { // 왼쪽손이 중앙인 경우 lDist = Math.abs(m.indexOf(lh) - m.indexOf(v)) // 현재 위치에서 목표와의 거리 계산 } if (r.includes(rh)) { // 오른쪽손이 우측인 경우 rDist = Math.abs(m.indexOf(rh - 1) - m.indexOf(v)) + 1 // 가운데로 이동 후 목표와의 거리 계산 } else { // 오른쪽손이 중앙인 경우 rDist = Math.abs(m.indexOf(rh) - m.indexOf(v)) // 현재 위치에서 목표와의 거리 계산 } if (lDist === rDist) { // 거리가 동일한 경우 const h = hand === "left" ? "L" : "R" result += h if (h === "L") lh = v else if (h === "R") rh = v } else { // 거리가 다른 경우 if (lDist < rDist) { result += "L" lh = v } else if (lDist > rDist) { result += "R" rh = v } } } } return result }

 

구현 로직

전형적인 구현 유형이고 거리 계산 부분이 조금 까다로울 뿐 문제 자체는 단순했습니다. 조작이 쉽도록 *, 0, #은 -1, -2, -3으로 변경했습니다. 문제에서 손가락은 상하좌우로만 이동이 가능하다고 하였고 나올 수 있는 목표 번호는 3가지 경우로 나뉩니다.

 

1. 목표가 좌측 번호(1, 4, 7)인 경우

왼쪽 손가락을 이동합니다.

 

2. 목표가 우측 번호(3, 6, 9)인 경우

오른쪽 손가락을 이동합니다.

 

3. 목표가 중앙 번호(2, 5, 8, -2)인 경우 

3-1. 양쪽 손가락의 목표와의 거리 계산

  • 왼쪽 손가락이 좌측 번호에 놓여있을 때
    왼쪽 손가락과 목표와의 거리 = 중앙으로 손가락을 이동한 거리 1 + 이동 후 왼쪽 손가락과 목표와의 거리
  • 오른쪽 손가락이 좌측 번호에 놓여있을 때
    오른쪽 손가락과 목표와의 거리 = 중앙으로 손가락을 이동한 거리 1 + 이동 후 오른쪽 손가락과 목표와의 거리

3-2. 목표와의 거리 비교 

  • 거리가 동일한 경우
    사용하는 손가락을 입력
  • 거리가 다른 경우
    더 짧은 거리에 있는 손가락을 입력

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.