Bleeding edge

[프로그래머스] 키패드 누르기 - 자바스크립트 본문

코딩테스트 공부

[프로그래머스] 키패드 누르기 - 자바스크립트

codevil 2022. 7. 18. 21:22

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

 

프로그래머스

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

programmers.co.kr

별로 좋아하는 방식은 아니지만 하드코딩을 이용하여 풀었다.

1-1 x, y에 알맞게 번호와 문자를 배치한다.

1-2 return할 result를 만든다. 

1-3 left와 right의 초기값을 만든다

    const list = { 1:[0,0], 2:[0,1], 3:[0,2], 4:[1,0], 5:[1,1], 6:[1,2], 7:[2,0], 8:[2,1], 9:[2,2], "*":[3,0], 0:[3,1], "#":[3,2]}
    let result = ""
    let [left, right] = ["*", "#"]

2-1 주어진 numbers에서 map을 사용하여 값에 한개씩 접근한다

2-2-1 x값이 0이면 left, 2이면, right로 값을 바꾼다

2-2-2 result에 2-2-1의 첫글자를 붙인다 (예시 : result = result + "L")

2-2-3 2-2-1에 해당하지 않는 경우에는, 현재 값과-left의 값, 현재값 - right 값을 비교해서 더 작은 값(절대값 기준)을 기준으로 2-2-1, 2-2-2를 접근한다.

2-2-4 만일 값이 같다고하면 왼손잡이면, 왼손에 붙이고, 오른손 잡이면 오른손에 붙인다.

    numbers.map((element)=>{
        if(list[element][1]===0){
            left = element;
            result = result + "L"
            return
        }else if(list[element][1]===2){
            right = element;
            result = result + "R"
            return
        }
        const leftDistance = Math.abs(list[element][0]-list[left][0]) +
              Math.abs(list[element][1]-list[left][1])
        const rightDistance = Math.abs(list[element][0]-list[right][0]) +
              Math.abs(list[element][1]-list[right][1])
        if(rightDistance>leftDistance){
            left = element
            result = result + "L"
        }else if(leftDistance>rightDistance){
            right = element
            result = result + "R"
        }else{
            if(hand ==="right"){
                right= element
                result = result + "R"
            }else{
                left = element
                result = result + "L"
            }
        }
        })

 

전체풀이

function solution(numbers, hand) {
    const list = { 1:[0,0], 2:[0,1], 3:[0,2], 4:[1,0], 5:[1,1], 6:[1,2], 7:[2,0], 8:[2,1], 9:[2,2], "*":[3,0], 0:[3,1], "#":[3,2]}
    let result = ""
    let [left, right] = ["*", "#"]
    numbers.map((element)=>{
        if(list[element][1]===0){
            left = element;
            result = result + "L"
            return
        }else if(list[element][1]===2){
            right = element;
            result = result + "R"
            return
        }
        const leftDistance = Math.abs(list[element][0]-list[left][0]) +
              Math.abs(list[element][1]-list[left][1])
        const rightDistance = Math.abs(list[element][0]-list[right][0]) +
              Math.abs(list[element][1]-list[right][1])
        if(rightDistance>leftDistance){
            left = element
            result = result + "L"
        }else if(leftDistance>rightDistance){
            right = element
            result = result + "R"
        }else{
            if(hand ==="right"){
                right= element
                result = result + "R"
            }else{
                left = element
                result = result + "L"
            }
        }
        })
    return result
}