문제 링크: https://programmers.co.kr/learn/courses/30/lessons/67256
나의 풀이: https://programmers.co.kr/learn/courses/30/lessons/67256/solution_groups?language=javascript&type=my
문제의 핵심: 1,4,7은 무조건 왼손, 3,6,9은 무조건 오른손, 2,5,8,0은 현재 손가락의 위치에 따라 다르게
→ 2,5,8,0을 만났을 때 왼손 엄지로부터 거리, 오른손 엄지로부터 거리를 각각 구한 후, 더 가까운 쪽이 이동하게 한다.
만약 거리가 같다면, 왼손잡이는 왼손, 오른손잡이는 오른손으로 이동하게 한다.
코드로 풀어보자면
(1) 현재 손가락 위치에서 입력된 키패드의 거리를 구하는 함수 getDistance
function getDistance(posN, posL, posR) {
let fromL = Math.abs(posN[0] - posL[0]) + Math.abs(posN[1] - posL[1]);
let fromR = Math.abs(posN[0] - posR[0]) + Math.abs(posN[1] - posR[1]);
return [fromL, fromR];
}
(2) 각 숫자의 위치를 행렬로 표시하기(ex: 숫자 키패드에서 1번은 [0,0]에 위치한다.)
const [one, two, three,
four, five, six,
seven, eight, nine,
star, zero, hash] =
[
[0, 0],[0, 1],[0, 2],
[1, 0],[1, 1],[1, 2],
[2, 0],[2, 1],[2, 2],
[3, 0],[3, 1],[3, 2]
];
(3) 입력되는 숫자별 위치를 쉽게 파악하기 위해 dials object 만들기
const dials = {
1: one,
2: two,
3: three,
4: four,
5: five,
6: six,
7: seven,
8: eight,
9: nine,
0: zero,
};
(4) solution 함수
function solution(numbers, hand) {
let answer = "";
let posL = star;
let posR = hash;
let lefts = [1, 4, 7];
let rights = [3, 6, 9];
numbers.forEach((n) => {
let posN = dials[n]; // 번호의 위치를 구한다.
if(lefts.includes(n)) { // 1,4,7에 해당하면 무조건 왼손(L)
answer+="L";
posL = posN;
} else if(rights.includes(n)){ // 3,6,9에 해당하면 무조건 오른손(R)
answer += "R";
posR = posN;
} else { // 나머지 경우 -> 직접 계산
// 거리 구하기
let [L, R] = getDistance(posN, posL, posR);
if (L < R) {
answer += "L";
posL = posN;
} else if (R < L) {
answer += "R";
posR = posN;
} else {
if (hand === "right") {
answer += "R";
posR = posN;
} else {
answer += "L";
posL = posN;
}
}
}
});
return answer;
}
'코딩테스트' 카테고리의 다른 글
[코딩테스트 기본] 10진수를 2진수로 바꾸기 (Javascript) (0) | 2022.02.20 |
---|---|
[코딩테스트] 2022 KAKAO BLIND RECRUITMENT 신고 결과 받기(Javascript) (0) | 2022.02.06 |
[프로그래머스 코딩테스트] 완전탐색 > 모의고사 (level 1) (0) | 2021.12.26 |
[코딩테스트] 2018 카카오 블라인드 테스트 - [1차]비밀지도 (Javascript) (0) | 2021.11.27 |
[코딩테스트] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기(Javascript) (0) | 2021.11.22 |