Jieunny의 λΈ”λ‘œκ·Έ

[JS] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 숫자 짝꿍 λ³Έλ¬Έ

Study/Coding Test

[JS] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - 숫자 짝꿍

Jieunny 2023. 1. 30. 17:51

πŸ“Œ  문제

두 μ •μˆ˜ X, Y의 μž„μ˜μ˜ μžλ¦¬μ—μ„œ κ³΅ν†΅μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” μ •μˆ˜ k(0 ≤ k ≤ 9)듀을 μ΄μš©ν•˜μ—¬ λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 μ •μˆ˜λ₯Ό 두 수의 짝꿍이라 ν•©λ‹ˆλ‹€(단, κ³΅ν†΅μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” μ •μˆ˜ 쀑 μ„œλ‘œ 짝지을 수 μžˆλŠ” 숫자만 μ‚¬μš©ν•©λ‹ˆλ‹€). X, Y의 짝꿍이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄, 짝꿍은 -1μž…λ‹ˆλ‹€. X, Y의 짝꿍이 0으둜만 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€λ©΄, 짝꿍은 0μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Yμ—μ„œ κ³΅ν†΅μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” 3, 0, 3으둜 λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 μ •μˆ˜μΈ 330μž…λ‹ˆλ‹€. λ‹€λ₯Έ μ˜ˆμ‹œλ‘œ X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Yμ—μ„œ κ³΅ν†΅μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” 2, 5, 5둜 λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 μ •μˆ˜μΈ 552μž…λ‹ˆλ‹€(Xμ—λŠ” 5κ°€ 3개, Yμ—λŠ” 5κ°€ 2개 λ‚˜νƒ€λ‚˜λ―€λ‘œ λ‚¨λŠ” 5 ν•œ κ°œλŠ” 짝 지을 수 μ—†μŠ΅λ‹ˆλ‹€.)
두 μ •μˆ˜ X, Yκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, X, Y의 짝꿍을 returnν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

  • 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000μž…λ‹ˆλ‹€.
  • X, YλŠ” 0으둜 μ‹œμž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • X, Y의 짝꿍은 μƒλ‹Ήνžˆ 큰 μ •μˆ˜μΌ 수 μžˆμœΌλ―€λ‘œ, λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

πŸ’‘  아이디어

X, Y 각자 μ–΄λ–€ 숫자λ₯Ό 가지고 μžˆλŠ”μ§€ 배열에 각각 μ €μž₯ν•œλ‹€.

두 λ°°μ—΄ λͺ¨λ‘ 0 보닀 큰 인덱슀일 경우 λ™μ‹œμ— 가지고 μžˆμœΌλ―€λ‘œ 빈 배열에 λ„£μ–΄μ£ΌλŠ”λ°, 더 μž‘μ€ 개수λ₯Ό 가진 배열을 κΈ°μ€€μœΌλ‘œ ν•΄μ•Όν•˜λ―€λ‘œ 두 개수 쀑 μž‘μ€ 갯수λ₯Ό min 에 λ‹΄μ•„ min만큼 repeat μ‹œμΌœμ€€λ‹€.

κ°€μž₯ 큰 수λ₯Ό κ΅¬ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ sortλ₯Ό μ‚¬μš©ν•΄μ„œ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.

닡이 '0', '00', '000'... 이 λ‚˜μ˜€λŠ” κ²½μš°λ„ 생각해야 ν•œλ‹€.

 

✏️  풀이

function solution(X, Y) {
  var answer = '';
  let same = [];

  let numberA = new Array(11);
  numberA.fill(0);
  let numberB = new Array(11);
  numberB.fill(0);
  
  // 무슨 수λ₯Ό 가지고 μžˆλŠ”μ§€ 각각 λ‹΄μ•„μ£ΌκΈ°.
  for(let i=0; i<X.length; i++){
    numberA[Number(X[i])] ++;
  }

  for(let i=0; i<Y.length; i++){
    numberB[Number(Y[i])] ++;
  }

  // 같은 숫자λ₯Ό 가지고 있으면 μƒˆ 배열에 λ„£μ–΄μ€€λ‹€.
  for(let i=0; i<numberA.length; i++){
    let min = numberA[i];
    if(numberA[i] > 0 && numberB[i] > 0){
      if(numberA[i] > numberB[i]){
        min = numberB[i];
      }
      same.push(String(i).repeat(min));
    }
  }

  // 같은 μˆ«μžκ°€ μ—†λŠ” 경우
  if(same.length === 0){
    return '-1';
  }
 
  same = same.join('');

  same = [...same];
  
  // λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ 정리
  same = same.sort((a, b) => {
    return b - a;
  });

  same = same.join('');
    
  // '0', '00', '000'...인 경우 생각  
  if(Number(same) === 0){
    same = '0'
  }

  return same;
}