키패드 누르기
2024. 6. 1. 15:40ㆍ알고리즘/카카오
https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
실행 결과 : 실패
두 점 사이의 거리를 유클리드 거리로 해결하려고 해서 오답이 나왔다. 맨허튼 거리로 구해야한다.
왜냐하면 문제 조건에 상하좌우로만 움직인다고 했기 때문이다. 유클리드 거리는 대각선에 위치한 좌표도 직선의 거리로 생각하기 때문에 올바른 답이 나오지 않는다.
- 유클리드 거리 : Math.sqrt(((y2 - y1) ** 2 + (x2 - x1) ** 2))
- 맨허튼 거리 : Math.abs(y2 - y1) + Math.abs(x2 - x1)
- 상하좌우로 움직인다 ➡ 맨허튼 거리
- 상하좌우 + 대각선 ➡ 유클리드 거리
function findPos(num, maps){
const n = maps.length;
const m = maps[0].length;
for(let i = 0; i<n; i++){
for(let j = 0; j<m; j++){
if(maps[i][j] === num) return [i, j];
}
}
}
function calcD(sPos, dPos){
return Math.abs(dPos[0] - sPos[0]) + Math.abs(dPos[1] - sPos[1]);
}
function solution(numbers, hand) {
const ret = [];
const maps = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
['*', 0, '#'],
];
let lPos = [3, 0];
let rPos = [3, 2];
const lPads = [1, 4, 7];
const rPads = [3, 6, 9];
numbers.forEach((num)=>{
const numPos = findPos(num, maps);
if(lPads.includes(num)){
lPos = [...numPos];
ret.push("L");
}
else if(rPads.includes(num)){
rPos = [...numPos];
ret.push("R");
}
else {
const ld = calcD(lPos, numPos);
const rd = calcD(rPos, numPos);
if(ld < rd){
lPos = [...numPos];
ret.push('L');
}
else if(ld > rd){
rPos = [...numPos];
ret.push('R');
}
else{
if(hand === 'left'){
lPos = [...numPos];
ret.push('L');
}
else {
rPos = [...numPos];
ret.push('R');
}
}
}
});
return ret.join("");
}