λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm

[Algorithm] 숫자 짝꿍

πŸ“‹ 문제 μ„€λͺ…

두 μ •μˆ˜ 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의 μ§κΏμ€ μƒλ‹Ήνžˆ ν° μ •μˆ˜μΌ μˆ˜ μžˆμœΌλ―€λ‘œ, λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆ

"100" "2345" "-1"
"100" "203045" "0"
"100" "123450" "10"
"12321" "42531" "321"
"5525" "1255" "552"

 

✏️ 풀이

λ¬Έμžμ—΄μ˜ 각 숫자λ₯Ό μΉ΄μš΄νŒ…ν•΄μ„œ 큰 μˆ˜λΆ€ν„° μ€‘λ³΅λ˜λŠ”λ§ŒνΌ answer에 더해주면 λœλ‹€κ³  μƒκ°ν–ˆλ‹€.

 

get, set μž‘μ—…μ΄ 많이 일어날 λ•Œμ—λŠ” 객체보닀 Map이 효율적이기 λ•Œλ¬Έμ— Map을 μ‚¬μš©ν•΄μ„œ 각 숫자λ₯Ό μΉ΄μš΄νŒ…ν–ˆλ‹€. λ˜ν•œ 큰 μˆ˜λΆ€ν„° answer에 λ°˜λ³΅ν•΄μ„œ λ”ν•΄μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ hash(Map)λ₯Ό μ •λ ¬ν•΄μ£Όκ³  λ§Œμ•½ λ‹€λ₯Έ hash에 μ—†λ‹€λ©΄ continue μ‹œμΌœμ€¬λ‹€. μ΄λ•Œ String의 λ©”μ„œλ“œμΈ repeat을 μ‚¬μš©ν•΄μ„œ answer에 κ°€λŠ₯ν•œλ§ŒνΌ 더해쀬닀.

 

λŒ€λΆ€λΆ„ ν†΅κ³Όν–ˆμ§€λ§Œ 일뢀 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ—μ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•΄μ„œ μ–΄λŠ 뢀뢄이 λ¬Έμ œμΈμ§€ μƒκ°ν•΄λ³΄μ•˜λ‹€. κ²°κ΅­ 찾은 뢀뢄이 answerλ₯Ό λ°˜ν™˜ν•˜λŠ” λΆ€λΆ„μ΄μ—ˆλ‹€."00"처럼 "0"이 μ€‘λ³΅λ˜λŠ” 경우 μ€‘λ³΅λ˜λŠ” "0"을 μ œκ±°ν•΄μ€˜μ•Ό ν•˜λŠ”λ° μ΄λ•Œ BigIntλ₯Ό μ‚¬μš©ν–ˆλ‹€. λ¬Έμ œλŠ” ν˜•λ³€ν™˜μ΄μ—ˆλ‹€. ν˜•λ³€ν™˜μ„ ν•΄μ„œ 숫자둜 λ³€ν™˜ν•˜κ³  λ¬Έμžμ—΄λ‘œ λ‹€μ‹œ λ³€ν™˜μ„ ν•΄μ£Όμ—ˆλŠ”λ° 이 μž‘μ—…μ΄ 생각보닀 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ΄μ—ˆλ˜ 것 κ°™λ‹€. λ”°λΌμ„œ "00"처럼 "0"이 쀑볡될 수 μžˆλŠ” 경우 answer λ¬Έμžμ—΄μ˜ μ²«μžλ¦¬κ°€ "0"일 λ•Œ 큰 κ°’λΆ€ν„° 진행을 ν–ˆκΈ° λ•Œλ¬Έμ— μ ˆλŒ€ "0123"κ³Ό 같은 κ²½μš°κ°€ λ‚˜μ˜¬ 수 μ—†μœΌλ―€λ‘œ "0"을 λ°˜ν™˜ν•΄μ£Όκ³  λ§Œμ•½ answer이 λΉˆλ¬Έμžμ—΄μΈ 경우 "-1"을 λ°˜ν™˜ν•¨μœΌλ‘œμ„œ 문제λ₯Ό ν•΄κ²°ν–ˆλ‹€.

 

⌨️ μ½”λ“œ

function solution(X, Y) {
  var answer = '';

  const hash1 = new Map();
  const hash2 = new Map();

  for (const n of X) hash1.set(n, (hash1.get(n) || 0) + 1);
  for (const n of Y) hash2.set(n, (hash2.get(n) || 0) + 1);

  const sortedHash1arr = [...hash1.entries()].sort((a, b) => b[0] - a[0]);
  for (const [k, v] of sortedHash1arr) {
    if (!hash2.get(k)) continue;
    answer += k.repeat(Math.min(v, hash2.get(k)));
  }

  return answer ? (answer[0] === '0' ? '0' : answer) : '-1';
}

'Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Algorithm] μžλ¬Όμ‡ μ™€ μ—΄μ‡   (0) 2023.04.23
[Algorithm] μΉ΄λ“œ λ­‰μΉ˜  (0) 2023.04.23
[Algorithm] μ˜Ήμ•Œμ΄(2)  (1) 2023.04.22
[Algorithm] λ¬Έμžμ—΄ λ‚˜λˆ„κΈ°  (0) 2023.04.19
[Algorithm] λ‘˜λ§Œμ˜ μ–Έμ–΄  (0) 2023.04.18