문제
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자
1
,4
,7
을 입력할 때는 왼손 엄지손가락을 사용합니다. - 오른쪽 열의 3개의 숫자
3
,6
,9
를 입력할 때는 오른손 엄지손가락을 사용합니다. - 가운데 열의 4개의 숫자
2
,5
,8
,0
을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
- 제한사항
- numbers 배열의 크기는 1 이상 1,000 이하입니다.
- numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
- hand는
"left"
또는"right"
입니다."left"
는 왼손잡이,"right"
는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는
L
, 오른손 엄지손가락을 사용한 경우는R
을 순서대로 이어붙여 문자열 형태로 return 해주세요.
나의 풀이
function solution(numbers, hand) {
let arr = [["*",7,4,1], [0,8,5,2], ["#",9,6,3]];
let leftPosition = [0, 0];
let rightPosition = [2, 0];
let answer = [];
function search(number) {
for(let i = 0; i < 3; i++) {
if(arr[i].includes(number)) return [i, arr[i].indexOf(number)];
}
};
for(let i = 0; i < numbers.length; i++) {
let location = search(numbers[i]);
let distanceFromLeft = [Math.abs(location[0] - leftPosition[0]), Math.abs(location[1] - leftPosition[1])];
let distanceFromRight = [Math.abs(location[0] - rightPosition[0]), Math.abs(location[1] - rightPosition[1])];
if (location[0] === 0) {
answer.push("L");
leftPosition = location;
}
else if (location[0] === 2) {
answer.push("R");
rightPosition = location;
}
else if((distanceFromLeft[0] + distanceFromLeft[1]) < (distanceFromRight[0] + distanceFromRight[1])) {
answer.push("L");
leftPosition = location;
}
else if((distanceFromLeft[0] + distanceFromLeft[1]) > (distanceFromRight[0] + distanceFromRight[1])) {
answer.push("R");
rightPosition = location;
}
else if((distanceFromLeft[0] + distanceFromLeft[1]) === (distanceFromRight[0] + distanceFromRight[1])) {
if(hand === "left") {
answer.push("L");
leftPosition = location;
}
else {
answer.push("R");
rightPosition = location;
}
}
}
return answer.join("");
}
- 풀이
function solution(numbers, hand) {
// 0 1 2 3
// 0 ["*",7,4,1]
// 1 [ 0 ,8,5,2]
// 2 ["#",9,6,3]
let arr = [["*",7,4,1], [0,8,5,2], ["#",9,6,3]];
// 배열 생성: 왼손, 오른손 현재 위치
let leftPosition = [0, 0];
let rightPosition = [2, 0];
// 배열 생성: 반환할 답
let answer = [];
// fnc : 숫자의 행,열 찾아주는 함수
function search(number) {
for(let i = 0; i < 3; i++) {
if(arr[i].includes(number)) return [i, arr[i].indexOf(number)];
}
};
// for문
// if search[i] == 0 => left / search[i] == 2 => right
// else if (왼손 거리 vs 오른손 거리)
// 왼손 거리 < 오른손 거리 => answer.push("L") , leftPosition = location
// 왼손 거리 > 오른손 거리 => answer.push("R") , rightPosition = location
// 왼손 거리 = 오른손 거리 => answer.push("오른손잡이 or 왼손잡이") , // = location
for(let i = 0; i < numbers.length; i++) {
// 배열 : 주어진 수의 위치
let location = search(numbers[i]);
// 배열 : 왼,오른손에서의 거리
let distanceFromLeft = [Math.abs(location[0] - leftPosition[0]), Math.abs(location[1] - leftPosition[1])];
let distanceFromRight = [Math.abs(location[0] - rightPosition[0]), Math.abs(location[1] - rightPosition[1])];
if (location[0] === 0) {
answer.push("L");
leftPosition = location;
}
else if (location[0] === 2) {
answer.push("R");
rightPosition = location;
}
else if((distanceFromLeft[0] + distanceFromLeft[1]) < (distanceFromRight[0] + distanceFromRight[1])) {
answer.push("L");
leftPosition = location;
}
else if((distanceFromLeft[0] + distanceFromLeft[1]) > (distanceFromRight[0] + distanceFromRight[1])) {
answer.push("R");
rightPosition = location;
}
else if((distanceFromLeft[0] + distanceFromLeft[1]) === (distanceFromRight[0] + distanceFromRight[1])) {
if(hand === "left") {
answer.push("L");
leftPosition = location;
}
else {
answer.push("R");
rightPosition = location;
}
}
}
return answer.join("");
}
- 정확도 테스트 결과
모범 답안
function solution(numbers, hand) {
function calcDistance(from, to) {
return Math.abs(from[0] - to[0]) + Math.abs(from[1] - to[1]);
}
let left = [1,4,7];
let center = [2,5,8,0];
let right = [3,6,9];
let Lpos = [0, 3];
let Rpos = [2, 3];
return numbers.map(num => {
if (left.includes(num)) {
Lpos = [0, left.indexOf(num)];
return 'L';
}
else if (right.includes(num)) {
Rpos = [0, right.indexOf(num)];
return 'R';
}
let numPos = [1, center.indexOf(num)];
if (calcDistance(numPos, Lpos) < calcDistance(numPos, Rpos)) {
Lpos = numPos;
return 'L';
}
else if (calcDistance(numPos, Lpos) > calcDistance(numPos, Rpos)) {
Rpos = numPos;
return 'R';
}
else if (calcDistance(numPos, Lpos) === calcDistance(numPos, Rpos)) {
if(hand === 'left') {
Lpos = numPos;
return 'L';
}
else if(hand === 'right') {
Rpos = numPos;
return 'R';
}
}
}).join('');
}
배열 하나에 2차원 배열을 구현하지 않고
방향에 따라 배열을 만들면 훨씬 깔끔해진다.
- 정확도 테스트 결과
시간은 거의 비슷하다
참고
'Coding test' 카테고리의 다른 글
[프로그래머스] 실패율 (Level 1) - javascript (0) | 2022.04.29 |
---|---|
[프로그래머스] 크레인 인형 뽑기 (Level 1) - javascript (0) | 2022.04.29 |
[프로그래머스] 신고 결과 받기 (Level 1) - javascript (0) | 2022.04.27 |
[프로그래머스] 예산 (Level 1) - javascript (0) | 2022.04.23 |
[프로그래머스] 폰켓몬 (Level 1) - javascript (0) | 2022.04.22 |