파이썬, 자바스크립트_카카오 Lv.1 - 키패드 누르기

naughty _deer·2022년 4월 29일
0

코딩테스트

목록 보기
7/7

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

문제 요약

가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때
더 가까운 엄지손가락을 사용
거리가 같다면, 편한 손가락 사용.
번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return

제한

numbers 배열의 크기는 1 이상 1,000 이하

풀기 전 생각

구현 문제, 2차원 리스트 이동.
numbers가 최대 1000이라 해도 시간복잡도 걱정을 할 필요 없다.

풀이 계획

  1. 각 숫자를 key값, 2차원 리스트 위치 값을 value로 가진 해시 테이블 초기화
  2. answer 문자열, 현재 오른손가락, 왼손가락 위치 선언.
  3. numbers 돌면서,
    numbers[i]가 1,4,7,*라면
    위치 바꿔주고
    answer에 'L'추가
    numbers[i]가 3,6,9,#라면
    위치 바꿔주고
    answer에 'R'추가
    나머지라면,
    위치 비교, 거리 작은 손 추가.
    거리 같다면 hand의 값에 따라 answer에 추가

풀이 코드

Python

def solution(numbers, hand):
  number_x_y = {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)}
  answer = ''
  left_posi = '*'
  right_posi = '#'

  for number in numbers:
    if number in [1,4,7,'*']:
      left_posi = number
      answer += 'L'
    elif number in [3,6,9,'#']:
      right_posi = number
      answer += 'R'
    else:
      left_dist = abs(number_x_y[left_posi][0] - number_x_y[number][0]) + abs(number_x_y[left_posi][1] - number_x_y[number][1])
      right_dist = abs(number_x_y[right_posi][0] - number_x_y[number][0]) + abs(number_x_y[right_posi][1] - number_x_y[number][1])
      if left_dist < right_dist:
        left_posi = number
        answer += 'L'
      elif left_dist > right_dist:
        right_posi = number
        answer += 'R'
      else:
        if hand == 'left':
          left_posi = number
          answer += 'L'
        else:
          right_posi = number
          answer += 'R'
  return answer

Javascript

function solution(numbers, hand) {
  const btnMap = {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]}
  const leftPart = [1,4,7,'*'];
  const rightPart = [3,6,9,'#'];
  let leftNow = '*';
  let rightNow = '#';

  let answer = ''
  for(let i=0; i<numbers.length; i++){
    if (leftPart.includes(numbers[i])){
      leftNow = numbers[i];
      answer += 'L';
    } else if (rightPart.includes(numbers[i])){
      rightNow = numbers[i];
      answer += 'R';
    } else{
      const nowXY = btnMap[numbers[i]];
      const leftXY = btnMap[leftNow];
      const rightXY = btnMap[rightNow];

      const leftDist =  Math.abs(nowXY[0]-leftXY[0]) + Math.abs(nowXY[1]-leftXY[1]);
      const rightDist =  Math.abs(nowXY[0]-rightXY[0]) + Math.abs(nowXY[1]-rightXY[1]);

      
      if (leftDist<rightDist){
        leftNow = numbers[i]
        answer += 'L';
      }else if(leftDist>rightDist){
        rightNow = numbers[i]
        answer += 'R';
      }else{
        if(hand === 'left'){
          leftNow = numbers[i]
          answer += 'L';
        } else{
          rightNow = numbers[i]
          answer += 'R';
        };
      };
    }
  };
  return answer;
}
profile
개발자로 취업하기

0개의 댓글