Jieunny의 λΈ”λ‘œκ·Έ

[JS] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ° λ³Έλ¬Έ

Study/Coding Test

[JS] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ°

Jieunny 2023. 2. 1. 12:22

πŸ“Œ  문제

슀마트폰 μ „ν™” ν‚€νŒ¨λ“œμ˜ 각 칸에 λ‹€μŒκ³Ό 같이 μˆ«μžλ“€μ΄ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€.

이 μ „ν™” ν‚€νŒ¨λ“œμ—μ„œ 왼손과 였λ₯Έμ†μ˜ μ—„μ§€μ†κ°€λ½λ§Œμ„ μ΄μš©ν•΄μ„œ μˆ«μžλ§Œμ„ μž…λ ₯ν•˜λ €κ³  ν•©λ‹ˆλ‹€.
맨 처음 왼손 엄지손가락은 * ν‚€νŒ¨λ“œμ— 였λ₯Έμ† 엄지손가락은 # ν‚€νŒ¨λ“œ μœ„μΉ˜μ—μ„œ μ‹œμž‘ν•˜λ©°, 엄지손가락을 μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. 엄지손가락은 μƒν•˜μ’Œμš° 4가지 λ°©ν–₯으둜만 이동할 수 있으며 ν‚€νŒ¨λ“œ 이동 ν•œ 칸은 거리둜 1에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  2. μ™Όμͺ½ μ—΄μ˜ 3개의 숫자 1, 4, 7을 μž…λ ₯ν•  λ•ŒλŠ” 왼손 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  3. 였λ₯Έμͺ½ μ—΄μ˜ 3개의 숫자 3, 6, 9λ₯Ό μž…λ ₯ν•  λ•ŒλŠ” 였λ₯Έμ† 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  4. κ°€μš΄λ° μ—΄μ˜ 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 ν•΄μ£Όμ„Έμš”.

πŸ’‘  아이디어

일단 2차원 배열에 ν‚€νŒ¨λ“œ λͺ¨μ–‘ ν• λ‹Ήν•΄μ€€λ‹€.

왼손 였λ₯Έμ†μ΄ 이전에 뭘 λˆŒλ €λŠ”μ§€ μ €μž₯ν•΄ 쀄 λ³€μˆ˜λ„ ν•„μš”ν•˜λ‹€.

numbers λŒλ©΄μ„œ 1, 4, 7 λ§Œλ‚˜λ©΄ answer에 'L'을 μ €μž₯ν•˜κ³ , 3, 6, 9λ₯Ό λ§Œλ‚˜λ©΄ 'R'을 μ €μž₯ν•œλ‹€.

λ‚˜λ¨Έμ§€ μˆ«μžλ‚˜ λ¬Έμžμ—΄μ„ λ§Œλ‚˜λ©΄ 거리λ₯Ό 계산해야 ν•˜λ―€λ‘œ 거리 κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“ λ‹€.

거리 κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λŠ” 이전에 λˆ„λ₯Έ 숫자의 2차원 인덱슀λ₯Ό κ΅¬ν•΄μ„œ λ‹€μŒμ— λˆ„λ₯Ό 숫자의 μΈλ±μŠ€μ™€ 거리λ₯Ό λΉ„κ΅ν•œλ‹€.

거리가 μž‘μ€ μ†μœΌλ‘œ λˆ„λ₯΄κ±°λ‚˜, 거리가 κ°™μœΌλ©΄ μ–΄λŠ μ†μž‘μ΄μΈμ§€μ— 따라 λˆ„λ₯Έλ‹€.

 

✏️  풀이

function solution(numbers, hand) {
  var answer = '';
  let left = '*';
  let right = '#';
  let keypad = [	// ν‚€νŒ¨λ“œ μ €μž₯
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    ['*', 0 , '#']
  ]

for(let i=0; i<numbers.length; i++){	
  if(numbers[i] === 1 || numbers[i] === 4 || numbers[i] === 7){
  // μ™Όμ†μœΌλ‘œ λˆ„λ₯Ό 숫자
    answer += 'L';
    left = numbers[i];
  }
  else if(numbers[i] === 3 || numbers[i] === 6 || numbers[i] === 9){
  // 였λ₯Έμ†μœΌλ‘œ λˆ„λ₯Ό 숫자
    answer += 'R';
    right = numbers[i];
  }
  else{
  // κ·Έ μ™Έμ˜ 숫자 λˆŒλ €μ„ λ•Œ
    let leftDistance = getDistance(keypad, left, numbers[i]);
    // μ™Όμ†μœΌλ‘œλΆ€ν„°μ˜ 거리
    let rightDistance = getDistance(keypad, right, numbers[i]);
    // 였λ₯Έμ†μœΌλ‘œλΆ€ν„°μ˜ 거리
    if(leftDistance > rightDistance){
      right = numbers[i];
      answer += 'R';
    }
    else if(leftDistance < rightDistance){
      left = numbers[i];
      answer += 'L';
    }
    else {
      if(hand === 'right'){
        right = numbers[i];
        answer += 'R';
      }
      else{
        left = numbers[i];
        answer += 'L';
      }
    }
  }
}
  return answer;
}

function getDistance(keypad, a, b){
// 인덱슀끼리 거리 κ΅¬ν•˜λŠ” ν•¨μˆ˜
  let ax = 0;
  let ay = 0;
  let bx = 0;
  let by = 0;
  let distance = 0;

  for(let i=0; i<4; i++){
    for(let j=0; j<3; j++){
      if(keypad[i][j] === a){
      // λˆ„λ₯Έ 숫자의 인덱슀 ꡬ해주기
        ax = i;
        ay = j;
      }
      if(keypad[i][j] === b){
        bx = i;
        by = j;
      }
    }
  }
  distance = Math.abs(ax - bx) +  Math.abs(ay - by);
  return distance;
}