새소식

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

[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

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

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