๐Ÿ“[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํ‘œ ํŽธ์ง‘

Chobbyยท2022๋…„ 4์›” 7์ผ
0

Programmers

๋ชฉ๋ก ๋ณด๊ธฐ
29/345

ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์€ dev-note-97๋‹˜์˜ [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํ‘œ ํŽธ์ง‘ / Javascript๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Œ์„ ๋ฏธ๋ฆฌ ๋ฐํž™๋‹ˆ๋‹ค.

๋ฌธ์ œ ์„ค๋ช…

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

์—…๋ฌด์šฉ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋‹ˆ๋‹ˆ์ฆˆ์›์Šค์˜ ์ธํ„ด์ธ ์•™๋ชฌ๋“œ๋Š” ๋ช…๋ น์–ด ๊ธฐ๋ฐ˜์œผ๋กœ ํ‘œ์˜ ํ–‰์„ ์„ ํƒ, ์‚ญ์ œ, ๋ณต๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ œ๋ฅผ ๋งก์•˜์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

์œ„ ๊ทธ๋ฆผ์—์„œ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ์น ํ•ด์ง„ ์นธ์€ ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋‹จ, ํ•œ ๋ฒˆ์— ํ•œ ํ–‰๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ‘œ์˜ ๋ฒ”์œ„(0ํ–‰ ~ ๋งˆ์ง€๋ง‰ ํ–‰)๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

  • "U X": ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์—์„œ X์นธ ์œ„์— ์žˆ๋Š” ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • "D X": ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์—์„œ X์นธ ์•„๋ž˜์— ์žˆ๋Š” ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • "C" : ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์„ ์‚ญ์ œํ•œ ํ›„, ๋ฐ”๋กœ ์•„๋ž˜ ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์‚ญ์ œ๋œ ํ–‰์ด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ํ–‰์ธ ๊ฒฝ์šฐ ๋ฐ”๋กœ ์œ— ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • "Z" : ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ญ์ œ๋œ ํ–‰์„ ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์€ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ํ‘œ์—์„œ "D 2"๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ์•„๋ž˜ ๊ทธ๋ฆผ์˜ ์™ผ์ชฝ์ฒ˜๋Ÿผ 4ํ–‰์ด ์„ ํƒ๋˜๋ฉฐ, "C"๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์„ ํƒ๋œ ํ–‰์„ ์‚ญ์ œํ•˜๊ณ , ๋ฐ”๋กœ ์•„๋ž˜ ํ–‰์ด์—ˆ๋˜ "๋„ค์˜ค"๊ฐ€ ์ ํžŒ ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(4ํ–‰์ด ์‚ญ์ œ๋˜๋ฉด์„œ ์•„๋ž˜ ์žˆ๋˜ ํ–‰๋“ค์ด ํ•˜๋‚˜์”ฉ ๋ฐ€๋ ค ์˜ฌ๋ผ์˜ค๊ณ , ์ˆ˜์ •๋œ ํ‘œ์—์„œ ๋‹ค์‹œ 4ํ–‰์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค).

๋‹ค์Œ์œผ๋กœ "U 3"์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ "C"๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„์˜ ํ‘œ ์ƒํƒœ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ "D 4"๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ "C"๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„์˜ ํ‘œ ์ƒํƒœ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 5ํ–‰์ด ํ‘œ์˜ ๋งˆ์ง€๋ง‰ ํ–‰ ์ด๋ฏ€๋กœ, ์ด ๊ฒฝ์šฐ ๋ฐ”๋กœ ์œ— ํ–‰์„ ์„ ํƒํ•˜๋Š” ์ ์— ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ "U 2"๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์€ 2ํ–‰์ด ๋ฉ๋‹ˆ๋‹ค.

์œ„ ์ƒํƒœ์—์„œ "Z"๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ œ๊ฑฐ๋œ "๋ผ์ด์–ธ"์ด ์ ํžŒ ํ–‰์ด ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œํ•œ๋ฒˆ "Z"๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ์œผ๋กœ ์ตœ๊ทผ์— ์ œ๊ฑฐ๋œ "์ฝ˜"์ด ์ ํžŒ ํ–‰์ด ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ํ˜„์žฌ ์„ ํƒ๋œ ํ–‰์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ์ ์— ์ฃผ์˜ํ•˜์„ธ์š”.

์ด๋•Œ, ์ตœ์ข… ํ‘œ์˜ ์ƒํƒœ์™€ ์ฒ˜์Œ ์ฃผ์–ด์ง„ ํ‘œ์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ํ–‰์€ "O", ์‚ญ์ œ๋œ ํ–‰์€ "X"๋กœ ํ‘œ์‹œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ ํ‘œ์˜ ํ–‰ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ n, ์ฒ˜์Œ์— ์„ ํƒ๋œ ํ–‰์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ k, ์ˆ˜ํ–‰ํ•œ ๋ช…๋ น์–ด๋“ค์ด ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐฐ์—ด cmd๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ํ‘œ์˜ ์ƒํƒœ์™€ ์ฒ˜์Œ ์ฃผ์–ด์ง„ ํ‘œ์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ํ–‰์€ O, ์‚ญ์ œ๋œ ํ–‰์€ X๋กœ ํ‘œ์‹œํ•˜์—ฌ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.


์ œํ•œ์‚ฌํ•ญ

  • 5 โ‰ค n โ‰ค 1,000,000

  • 0 โ‰ค k < n

  • 1 โ‰ค cmd์˜ ์›์†Œ ๊ฐœ์ˆ˜ โ‰ค 200,000

    • cmd์˜ ๊ฐ ์›์†Œ๋Š” "U X", "D X", "C", "Z" ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
    • X๋Š” 1 ์ด์ƒ 300,000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ด๋ฉฐ 0์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • X๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ์ž์—ฐ์ˆ˜์— ',' ๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 123,456์˜ ๊ฒฝ์šฐ 123456์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
    • cmd์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  X๋“ค์˜ ๊ฐ’์„ ํ•ฉ์นœ ๊ฒฐ๊ณผ๊ฐ€ 1,000,000 ์ดํ•˜์ธ ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
    • ํ‘œ์˜ ๋ชจ๋“  ํ–‰์„ ์ œ๊ฑฐํ•˜์—ฌ, ํ–‰์ด ํ•˜๋‚˜๋„ ๋‚จ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋ณธ๋ฌธ์—์„œ ๊ฐ ํ–‰์ด ์ œ๊ฑฐ๋˜๊ณ  ๋ณต๊ตฌ๋˜๋Š” ๊ณผ์ •์„ ๋ณด๋‹ค ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ด๊ธฐ ์œ„ํ•ด "์ด๋ฆ„" ์—ด์„ ์‚ฌ์šฉํ•˜์˜€์œผ๋‚˜, "์ด๋ฆ„"์—ด์˜ ๋‚ด์šฉ์ด ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ณผ์ •์— ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. "์ด๋ฆ„"์—ด์—๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„๋“ค์ด ์ค‘๋ณต์—†์ด ์ฑ„์›Œ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ์„ธ์š”.
  • ํ‘œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ด๋™์€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌํ•  ํ–‰์ด ์—†์„ ๋•Œ(์ฆ‰, ์‚ญ์ œ๋œ ํ–‰์ด ์—†์„ ๋•Œ) "Z"๊ฐ€ ๋ช…๋ น์–ด๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  • ์ •๋‹ต์€ ํ‘œ์˜ 0ํ–‰๋ถ€ํ„ฐ n - 1ํ–‰๊นŒ์ง€์— ํ•ด๋‹น๋˜๋Š” O, X๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด๋ถ™์ธ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ return ํ•ด์ฃผ์„ธ์š”.

์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ œํ•œ ์‚ฌํ•ญ

  • 5 โ‰ค n โ‰ค 1,000

  • 1 โ‰ค cmd์˜ ์›์†Œ ๊ฐœ์ˆ˜ โ‰ค 1,000
    ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ œํ•œ ์‚ฌํ•ญ

  • ์ฃผ์–ด์ง„ ์กฐ๊ฑด ์™ธ ์ถ”๊ฐ€ ์ œํ•œ์‚ฌํ•ญ ์—†์Šต๋‹ˆ๋‹ค.


์ž…์ถœ๋ ฅ ์˜ˆ

nkcmdresult
82["D 2","C","U 3","C","D 4","C","U 2","Z","Z"]"OOOOXOOO"
82["D 2","C","U 3","C","D 4","C","U 2","Z","Z","U 1","C"]"OOXOXOOO"

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1

๋ฌธ์ œ์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #2

๋‹ค์Œ์€ 9๋ฒˆ์งธ ๋ช…๋ น์–ด๊นŒ์ง€ ์ˆ˜ํ–‰ํ•œ ํ›„์˜ ํ‘œ ์ƒํƒœ์ด๋ฉฐ, ์ด๋Š” ์ž…์ถœ๋ ฅ ์˜ˆ #1๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

10๋ฒˆ์งธ ๋ช…๋ น์–ด "U 1"์„ ์ˆ˜ํ–‰ํ•˜๋ฉด "์–ดํ”ผ์น˜"๊ฐ€ ์ ํžŒ 2ํ–‰์ด ์„ ํƒ๋˜๋ฉฐ, ๋งˆ์ง€๋ง‰ ๋ช…๋ น์–ด "C"๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์„ ํƒ๋œ ํ–‰์„ ์‚ญ์ œํ•˜๊ณ , ๋ฐ”๋กœ ์•„๋ž˜ ํ–‰์ด์—ˆ๋˜ "์ œ์ด์ง€"๊ฐ€ ์ ํžŒ ํ–‰์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ฒ˜์Œ ์ฃผ์–ด์ง„ ํ‘œ์˜ ์ƒํƒœ์™€ ์ตœ์ข… ํ‘œ์˜ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


์ œํ•œ์‹œ๊ฐ„ ์•ˆ๋‚ด

  • ์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ : 10์ดˆ
  • ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ : ์–ธ์–ด๋ณ„๋กœ ์ž‘์„ฑ๋œ ์ •๋‹ต ์ฝ”๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ์ ์ • ๋ฐฐ์ˆ˜

๋‚˜์˜ ํ’€์ด

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š๋ƒ๊ฐ€ ๊ด€๊ฑด์ด ๋œ๋‹ค.

function solution(n, k, cmd) {
    let arr = Array(n).fill().map((_,i) => i)
    const deleted = []
    let select = k
    const result = []
    cmd.forEach(ord => {
        switch(ord[0]) {
            case 'D':
                select+=Number(ord[2])
                break
            case 'C':
                deleted.push([arr.splice(select,1)[0],select])
                if(select > arr.length) {
                    select = arr.length
                }
                break
            case 'U':
                select-=Number(ord[2])
                break
            case 'Z':
                const [val,idx] = deleted.pop()
                arr.splice(idx,0,val)
                break
        }
    })
    
    return Array(n).fill().map((_,i) => arr.includes(i) ? 'O':'X').join("")
}

ํ•„์ž์˜ ๊ฒฝ์šฐ์—๋Š” ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ์„ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค๊ฐ€ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜๋„ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Œ

์–‘๋ฐฉํ–ฅ ๋ฆฌ์ŠคํŠธ๋ž€ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” {idx:1, prev: prevNode, next:nextNode} ํ˜•์‹์œผ๋กœ ์—ฎ์—ฌ์žˆ๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

์ฆ‰ ์ฐพ๊ธฐ๋„ ์‰ฝ๊ณ  ๋นผ๊ณ  ๋„ฃ๊ณ ์˜ ํšจ์œจ์ด ๋งค์šฐ ๋†’์•„์ง

function solution(n, k, cmd) {
    const answer = Array(n).fill('O')
    const root = new Node(0)
    let curNode = root
    let prevNode = root
    for(let i = 1 ; i < n ; i ++) {
        // ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
        const newNode = new Node(i, prevNode)
        prevNode.next = newNode
        prevNode = newNode
        
        // ์„ ํƒ๋˜์—ˆ๋‹ค๋ฉด
        if(i === k) {
            curNode = newNode
        }
    }
    
    const deleted = []
    cmd.forEach((order) => {
        const [ord, val] = order.split(' ')
        let i = 0
        switch(ord) {
            case 'U':
                while(i < val && curNode.prev) {
                    curNode = curNode.prev
                    i++
                }
                break
            case 'D':
                while(i < val && curNode.next) {
                    curNode = curNode.next
                    i++
                }
                break
            case 'C':
                deleted.push(curNode)
                const prev = curNode.prev
                const next = curNode.next
                if(prev && next) {
                    prev.next = next
                    next.prev = prev
                    curNode = next
                } else if (prev) {
                    prev.next = null
                    curNode = prev
                } else if (next) {
                    next.prev = null
                    curNode = next
                }
                break
            case 'Z':
                const node = deleted.pop()
                const prevNode = node.prev
                const nextNode = node.next
                if(prevNode) {
                    prevNode.next = node
                }
                if(nextNode) {
                    nextNode.prev = node
                }
                break
        }
    })
    
    deleted.forEach(node => {
        answer[node.idx] = 'X'
    })
    return answer.join('')
    return 
}

function Node(idx,prevNode) {
    this.idx = idx
    this.prev = prevNode
    this.next
}
profile
๋‚ด ์ง€์‹์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋‹ดํ•จ

0๊ฐœ์˜ ๋Œ“๊ธ€