๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ํ˜ธํ…” ๋ฐฉ ๋ฐฐ์ •

๐Ÿ“‹ ๋ฌธ์ œ

[๋ณธ ๋ฌธ์ œ๋Š” ์ •ํ™•์„ฑ๊ณผ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ๊ฐ๊ฐ ์ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.]

"์Šค๋…ธ์šฐํƒ€์šด"์—์„œ ํ˜ธํ…”์„ ์šด์˜ํ•˜๊ณ  ์žˆ๋Š” "์Šค์นดํ”ผ"๋Š” ํ˜ธํ…”์— ํˆฌ์ˆ™ํ•˜๋ ค๋Š” ๊ณ ๊ฐ๋“ค์—๊ฒŒ ๋ฐฉ์„ ๋ฐฐ์ •ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธํ…”์—๋Š” ๋ฐฉ์ด ์ด k๊ฐœ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ๋ฐฉ์€ 1๋ฒˆ๋ถ€ํ„ฐ k๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๋ฐฉ์ด ๋น„์–ด ์žˆ์œผ๋ฉฐ "์Šค์นดํ”ผ"๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์— ๋”ฐ๋ผ ๊ณ ๊ฐ์—๊ฒŒ ๋ฐฉ์„ ๋ฐฐ์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•œ ๋ฒˆ์— ํ•œ ๋ช…์”ฉ ์‹ ์ฒญํ•œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ์„ ๋ฐฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ณ ๊ฐ์€ ํˆฌ์ˆ™ํ•˜๊ธฐ ์›ํ•˜๋Š” ๋ฐฉ ๋ฒˆํ˜ธ๋ฅผ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ณ ๊ฐ์ด ์›ํ•˜๋Š” ๋ฐฉ์ด ๋น„์–ด ์žˆ๋‹ค๋ฉด ์ฆ‰์‹œ ๋ฐฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ณ ๊ฐ์ด ์›ํ•˜๋Š” ๋ฐฉ์ด ์ด๋ฏธ ๋ฐฐ์ •๋˜์–ด ์žˆ์œผ๋ฉด ์›ํ•˜๋Š” ๋ฐฉ๋ณด๋‹ค ๋ฒˆํ˜ธ๊ฐ€ ํฌ๋ฉด์„œ ๋น„์–ด์žˆ๋Š” ๋ฐฉ ์ค‘ ๊ฐ€์žฅ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๋ฐฉ์„ ๋ฐฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฉ์ด ์ด 10๊ฐœ์ด๊ณ , ๊ณ ๊ฐ๋“ค์ด ์›ํ•˜๋Š” ๋ฐฉ ๋ฒˆํ˜ธ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ [1, 3, 4, 1, 3, 1] ์ผ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฉ์„ ๋ฐฐ์ •๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๋ฐฉ ๋ฒˆํ˜ธ ๋ฐฐ์ •๋œ ๋ฐฉ ๋ฒˆํ˜ธ

1 1
3 3
4 4
1 2
3 5
1 6


์ „์ฒด ๋ฐฉ ๊ฐœ์ˆ˜ k์™€ ๊ณ ๊ฐ๋“ค์ด ์›ํ•˜๋Š” ๋ฐฉ ๋ฒˆํ˜ธ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด room_number๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ ๊ณ ๊ฐ์—๊ฒŒ ๋ฐฐ์ •๋˜๋Š” ๋ฐฉ ๋ฒˆํ˜ธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.


์ œํ•œ์‚ฌํ•ญ

  • k๋Š” 1 ์ด์ƒ 10^12 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • room_number ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 1 ์ด์ƒ 200,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • room_number ๋ฐฐ์—ด ๊ฐ ์›์†Œ๋“ค์˜ ๊ฐ’์€ 1 ์ด์ƒ k ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • room_number ๋ฐฐ์—ด์€ ๋ชจ๋“  ๊ณ ๊ฐ์ด ๋ฐฉ์„ ๋ฐฐ์ •๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, k = 5, room_number = [5, 5] ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋ฐฉ์„ ๋ฐฐ์ •๋ฐ›์ง€ ๋ชปํ•˜๋Š” ๊ณ ๊ฐ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  •  

์ž…์ถœ๋ ฅ ์˜ˆ

10 [1,3,4,1,3,1]  [1,3,4,2,5,6]

 

โœ๏ธ ํ’€์ด

์ด์ „์— union&find ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ๊ธฐ์–ต์ด ๋‚˜์„œ ๋น„์Šทํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์–ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

find๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. find๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ํ•ด๋‹น ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜(๋ฐฐ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํ•ด๋‹น ์ˆ˜ / ์ด๋ฏธ ๋ฐฐ์ •๋˜์–ด ์žˆ๋‹ค๋ฉด 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ๋‹ค์Œ ์ˆ˜)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

k์˜ ํฌ๊ธฐ๊ฐ€ 10^12์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ธฐ์—๋Š” ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๋งŒ์•ฝ hash๋ผ๋Š” ๊ฐ์ฒด์— ์›ํ•˜๋Š” ๋ฐฉ ๋ฒˆํ˜ธ๋ฅผ ํ‚ค๋กœ ๊ฐ€์ง€๋Š” ๊ฐ’์ด ์—†๋‹ค๋ฉด ๋ฐฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์ด๋ผ๋Š” ๋œป์ด๋ฏ€๋กœ ๋ฐฉ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  hash ๊ฐ์ฒด์—๋Š” ๋ฐฉ ๋ฒˆํ˜ธ๋ฅผ key๋กœ ๋ฐฉ ๋ฒˆํ˜ธ + 1์„ ๊ฐ’์œผ๋กœ ์ €์žฅํ–ˆ๋‹ค. ๋ฐฉ ๋ฒˆํ˜ธ + 1์„ ํ• ๋‹นํ•˜๋Š” ์ด์œ ๋Š” ์ดํ›„์— ๊ฐ™์€ ์ˆ˜์˜ ๋ฐฉ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด์—์„œ ์ฐธ์กฐํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜์ฃผ๊ธฐ ์œ„ํ•จ์ด๋‹ค. hash ๊ฐ์ฒด์—์„œ ์„ ์ธ๋ฑ์Šค๋กœ ํ™•์ธํ–ˆ์„ ๋•Œ ์กด์žฌํ•œ๋‹ค๋ฉด ์ด๋ฏธ ๋ฐฐ์ •๋œ room์ด๊ธฐ ๋•Œ๋ฌธ์— hash[room]์„ ์ธ์ž๋กœ find ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€ํ˜ธ์ถœํ•˜๊ณ  ์ด๋ฅผ hash[room]์— ์ €์žฅํ–ˆ๋‹ค. 

 

๋งŒ์•ฝ 1๋ฒˆ๋ฐฉ๋ถ€ํ„ฐ 3๋ฒˆ๋ฐฉ๊นŒ์ง€ ๋ชจ๋‘ ๋ฐฐ์ •์ด ๋˜์–ด์žˆ์„๋•Œ 1๋ฒˆ ๋ฐฉ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž. {1: 2, 2: 3, 3: 4}๋กœ hash์— ์ €์žฅ๋˜์–ด ์žˆ์„ํ…๋ฐ find ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ด๋ฏธ 1๋ฒˆ๋ฐฉ์ด ๋ฐฐ์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— find(hash[1])์„ ์žฌ๊ท€ํ˜ธ์ถœํ•˜๊ณ  ์ดํ›„๋กœ๋„ 3๋ฒˆ๋ฐฉ๊นŒ์ง€ ๋ฐฐ์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ  find(hash[2]), find(hash[3])์ด ํ˜ธ์ถœ๋˜์–ด hash[4]์— 5๋ฅผ ํ• ๋‹นํ•˜๊ณ  5๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜์”ฉ ์ข…๋ฃŒ๋˜๋ฉด์„œ ๋งˆ์ง€๋ง‰์— ๋ฐ˜ํ™˜๊ฐ’์„ hash[room]์— ํ• ๋‹นํ•ด ์ตœ์‹ ํ™”๋ฅผ ํ•ด์ค€๋‹ค. 5๊ฐ€ ๊ณ„์† ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์˜ค๊ธฐ ๋•Œ๋ฌธ์— {1: 5, 2: 5, 3: 5, 4:5}๋กœ ์ตœ์‹ ํ™”๋˜๊ณ  ์ดํ›„์— ์ด๋ฏธ ๋ฐฐ์ •๋œ ๋‹ค๋ฅธ ๋ฐฉ์„ ์›ํ•  ๋•Œ 5๊นŒ์ง€ ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌธ์ œ๋Š” ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์„ ๋•Œ ์ •ํ™•์„ฑํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ํ†ต๊ณผํ•˜์ง€๋งŒ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธํ•˜๋‚˜๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์ฝ”๋“œ์˜ ๊ฐœ์„ ์‚ฌํ•ญ์€ ๋„์ €ํžˆ ์—†์„ ๊ฒƒ ๊ฐ™์•˜๊ณ  ์žฌ๊ท€ํ˜ธ์ถœ์ด ์•„๋‹Œ while๋ฌธ์„ ์‚ฌ์šฉํ–ˆ์Œ์—๋„ ๊ฒฐ๊ณผ๋Š” ๊ฐ™์•˜๋‹ค. ํ˜น์‹œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ๋ผ๋Š” ๊ฒƒ์ด์—ˆ๊ณ  ๋Œ€์•ˆ์œผ๋กœ๋Š” Map๊ฐ์ฒด๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ธฐ์กด์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ map์˜ ๋ฉ”์„œ๋“œ set, get, has๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ œ์ถœํ•˜๋‹ˆ ํ†ต๊ณผ๊ฐ€ ๋ฌ๋‹ค.

 

map๋ณด๋‹ค๋Š” ๊ฐ์ฒด๊ฐ€ ๋” ๋น ๋ฅผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๋ณด๋‹ˆ ๋ช‡ ๋ฐฐ์˜ ์ฐจ์ด๊ฐ€ ๋‚ฌ๋‹ค. ๊ฐ์ฒด์™€ map์˜ ์ฐจ์ด์ ์„ ์ •๋ฆฌํ•ด์ฃผ์‹  ๋ถ„์˜ ํฌ์ŠคํŒ…์„ ๋ดค๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

 

  Map Object
key Types Map์€ ์–ด๋– ํ•œ ๊ฐ’๋„ key๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. Object์˜ key๋Š” String ๋˜๋Š” Symbol์ด์–ด์•ผ ํ•œ๋‹ค.
key Order Map์€ ์‚ฝ์ž…ํ•œ ์ˆœ์„œ๋Œ€๋กœ key๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค. Map์„ iterateํ•  ๊ฒฝ์šฐ ์‚ฝ์ž…๋œ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค. Object์˜ key๋“ค์€ ํ˜„์žฌ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ํ•ด๋‹น ์ˆœ์„œ๋“ค์€ ํ•ญ์ƒ ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ Object property ์ˆœ์„œ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
Iteration Map ์€ ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜๋ฉฐ directํ•˜๊ฒŒ iterate ํ•  ์ˆ˜ ์žˆ๋‹ค. Object๋Š” iteration ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋”ฐ๋ผ์„œ direct ํ•˜๊ฒŒ iterate๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค. (Object.keys ๋‚˜ Object.entries ๋˜๋Š” for..in ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค)
performance ๋นˆ๋ฒˆํ•œ key-value pair์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ์‹œ ๋” ๋†’์€ performance๋ฅผ ๊ฐ€์ง„๋‹ค. get์—์„œ object์— ๋น„ํ•ด performance๊ฐ€ ๋А๋ฆฌ๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ๋‹ค. key-value pair์˜ ๋นˆ๋ฒˆํ•œ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ์— ๋Œ€ํ•œ ์ตœ์ ํ™”๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค.
Serialization and parsing No native support for serialization or parsing JSON.stringify() ๋ฐ JSON.parse()๋ฅผ ์ง€์›ํ•œ๋‹ค.

์ถœ์ฒ˜ - https://velog.io/@namda-on/JavaScript-Map-%EA%B3%BC-Object-%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

Map์ด ๋นˆ๋ฒˆํ•œ key-value pair์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ์‹œ ๋” ๋†’์€ performance๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•œ๋‹ค!! Map ์ž๋ฃŒ๊ตฌ์กฐ ์• ์šฉํ•ด์•ผ๊ฒ ๋‹น

 

โŒจ๏ธ ์ฝ”๋“œ

function solution(k, room_number) {
  var answer = [];

  const hash = new Map();
  const find = room => {
    if (!hash.has(room)) {
      hash.set(room, room + 1);
      return room;
    } else {
      const findRoom = find(hash.get(room));
      hash.set(room, findRoom);
      return findRoom;
    }
  };

  for (const number of room_number) {
    const room = find(number);
    answer.push(room);
  }

  return answer;
}