반응형
오늘은 카카오 인턴십 문제인 키패드 누르기를 풀어보겠습니다.
문제는 다음과 같습니다.
https://programmers.co.kr/learn/courses/30/lessons/67256
* 풀이 방법
- 3, 6, 9는 오른손, 1, 4, 7은 왼손이므로 상관없는데 가운데 키패드에 대한 조건을 추가해야합니다.
- 만약 가운데 키패드를 누를 경우는 거리를 따져줍니다. 거리를 계산해서 가까운 손을 적용해줍니다.
* 코드
/*
키패드 누르기 1번 풀이 : 객체 배열을 이용한 문제 풀이
*/
const getDistance = (current, next) => {
return Math.abs(current.x - next.x) + Math.abs(current.y - next.y);
}
function solution(numbers, hand) {
let answer = '';
const phone = [
{x: 1, y: 3},
{x: 0, y: 0},
{x: 1, y: 0},
{x: 2, y: 0},
{x: 0, y: 1},
{x: 1, y: 1},
{x: 2, y: 1},
{x: 0, y: 2},
{x: 1, y: 2},
{x: 2, y: 2}
];
const left = {
'x': 0,
'y': 3
};
const right = {
'x': 2,
'y': 3
};
for(let i = 0; i < numbers.length; i++) {
if([3,6,9].includes(numbers[i])) answer += 'R';
if([1,4,7].includes(numbers[i])) answer += 'L';
if([2,5,8,0].includes(numbers[i])){
if(getDistance(left, phone[numbers[i]]) === getDistance(right, phone[numbers[i]])){
answer += hand === 'left'? 'L' : 'R';
}
if(getDistance(left, phone[numbers[i]]) > getDistance(right, phone[numbers[i]])) {
answer += 'R';
}
if(getDistance(left, phone[numbers[i]]) < getDistance(right, phone[numbers[i]])) {
answer += 'L';
}
}
if(answer[answer.length-1] === 'L') {
[left.x, left.y] = [phone[numbers[i]].x, phone[numbers[i]].y];
}
if(answer[answer.length-1] === 'R') {
[right.x, right.y] = [phone[numbers[i]].x, phone[numbers[i]].y];
}
}
return answer;
}
console.log(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right"));
console.log(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left"));
console.log(solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0] , "right"));
반응형
'알고리즘' 카테고리의 다른 글
프로그래머스 체육복(Greedy) - level1 (0) | 2021.08.11 |
---|---|
프로그래머스 타겟 넘버 - level2(dfs) (0) | 2021.08.11 |
프로그래머스 - 문자열 내 마음대로 정렬하기 (0) | 2021.08.10 |
프로그래머스 소수 찾기 - level2 (완전 탐색) (0) | 2021.08.06 |
카카오 프로그래머스 level1 실패율(2019 KAKAO BLIND RECRUITMENT) (0) | 2021.08.05 |