[Boj_7662] ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/7662

 

โ–ธ ๋ฌธ์ œ

์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ(dual priority queue)๋Š” ์ „ํ˜•์ ์ธ ์šฐ์„ ์ˆœ์œ„ ํ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ์ „ํ˜•์ ์ธ ํ์™€์˜ ์ฐจ์ด์ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์—ฐ์‚ฐ(operation) ๋ช…๋ น์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ ๋˜๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ๋ฐ์ดํ„ฐ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ ์ด๋‹ค. ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์œ„ํ•ด์„  ๋‘ ๊ฐ€์ง€ ์—ฐ์‚ฐ์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์—ฐ์‚ฐ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์€ ๋˜ ๋‘ ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋˜๋Š”๋ฐ ํ•˜๋‚˜๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฒƒ์„ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒƒ์„ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

์ •์ˆ˜๋งŒ ์ €์žฅํ•˜๋Š” ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ Q๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. Q์— ์ €์žฅ๋œ ๊ฐ ์ •์ˆ˜์˜ ๊ฐ’ ์ž์ฒด๋ฅผ ์šฐ์„ ์ˆœ์œ„๋ผ๊ณ  ๊ฐ„์ฃผํ•˜์ž.

Q์— ์ ์šฉ๋  ์ผ๋ จ์˜ ์—ฐ์‚ฐ์ด ์ฃผ์–ด์งˆ ๋•Œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„ ์ตœ์ข…์ ์œผ๋กœ Q์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์ค‘ ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.

 

โ–ธ ์ž…๋ ฅ

์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” ํ‘œ์ค€์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์€ T๊ฐœ์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ž…๋ ฅ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ์ฒซ์งธ ์ค„์—๋Š” Q์— ์ ์šฉํ•  ์—ฐ์‚ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ k (k ≤ 1,000,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด์–ด์ง€๋Š” k ์ค„ ๊ฐ๊ฐ์—” ์—ฐ์‚ฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž(‘D’ ๋˜๋Š” ‘I’)์™€ ์ •์ˆ˜ n์ด ์ฃผ์–ด์ง„๋‹ค. ‘I n’์€ ์ •์ˆ˜ n์„ Q์— ์‚ฝ์ž…ํ•˜๋Š” ์—ฐ์‚ฐ์„ ์˜๋ฏธํ•œ๋‹ค. ๋™์ผํ•œ ์ •์ˆ˜๊ฐ€ ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ์Œ์„ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค. ‘D 1’๋Š” Q์—์„œ ์ตœ๋Œ“๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์„ ์˜๋ฏธํ•˜๋ฉฐ, ‘D -1’๋Š” Q ์—์„œ ์ตœ์†Ÿ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์„ ์˜๋ฏธํ•œ๋‹ค. ์ตœ๋Œ“๊ฐ’(์ตœ์†Ÿ๊ฐ’)์„ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์—์„œ ์ตœ๋Œ“๊ฐ’(์ตœ์†Ÿ๊ฐ’)์ด ๋‘˜ ์ด์ƒ์ธ ๊ฒฝ์šฐ, ํ•˜๋‚˜๋งŒ ์‚ญ์ œ๋จ์„ ์œ ๋…ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

๋งŒ์•ฝ Q๊ฐ€ ๋น„์–ด์žˆ๋Š”๋ฐ ์ ์šฉํ•  ์—ฐ์‚ฐ์ด ‘D’๋ผ๋ฉด ์ด ์—ฐ์‚ฐ์€ ๋ฌด์‹œํ•ด๋„ ์ข‹๋‹ค. Q์— ์ €์žฅ๋  ๋ชจ๋“  ์ •์ˆ˜๋Š” -231 ์ด์ƒ 231 ๋ฏธ๋งŒ์ธ ์ •์ˆ˜์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ถœ๋ ฅ์€ ํ‘œ์ค€์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด, ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ Q์— ๋‚จ์•„ ์žˆ๋Š” ๊ฐ’ ์ค‘ ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ผ. ๋‘ ๊ฐ’์€ ํ•œ ์ค„์— ์ถœ๋ ฅํ•˜๋˜ ํ•˜๋‚˜์˜ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋ผ. ๋งŒ์•ฝ Q๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ‘EMPTY’๋ฅผ ์ถœ๋ ฅํ•˜๋ผ.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 4
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ์ž๋ฃŒ ๊ตฌ์กฐ, ์ง‘ํ•ฉ๊ณผ ๋งต, ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ง‘ํ•ฉ๊ณผ ๋งต, ์šฐ์„ ์ˆœ์œ„ ํ
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, ์ƒˆ๋กœ์šด ๊ฐ’์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ˆœํžˆ remove() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ ๋‚ด๋ถ€์—์„œ ์›ํ•˜๋Š” ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค ํ•˜๋ฉด, ํ๋ฅผ ์ˆœ์ฐจ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(n) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋ฐœ์ƒํ•ด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ์‹์ด ํ•„์š”ํ•˜๋‹ค.

 

1๏ธโƒฃ ์ตœ์†Œํž™, ์ตœ๋Œ€ํž™๊ณผ Map ์‚ฌ์šฉ

ํƒ์ƒ‰ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ ํž™(Max Heap) ๊ณผ ์ตœ์†Œ ํž™(Min Heap), ๋‘ ๊ฐœ์˜ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ตœ์†Œ ํž™(Min Heap) : ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ ๊ตฌ์กฐ์ด๋ฉฐ, ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ๊ฐ’์ด ์ž‘์•„์ง„๋‹ค.
  • ์ตœ๋Œ€ ํž™(Max Heap) : ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ ๊ตฌ์กฐ์ด๋ฉฐ, ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ๊ฐ’์ด ์ปค์ง„๋‹ค.

์ž…๋ ฅ๋ฐ›์€ ์ •์ˆ˜๋ฅผ ๋‘ ํž™์— ๋™์‹œ์— ์ €์žฅํ•ด๋‘๋ฉด, ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’ ํƒ์ƒ‰์„ O(1) ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๊ฐ™์€ ์ •์ˆ˜๊ฐ€ ์ตœ๋Œ€ ํž™๊ณผ ์ตœ์†Œ ํž™์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์— ์ €์žฅ๋˜๋ฏ€๋กœ, ํ•˜๋‚˜์˜ ํž™์—์„œ ์‚ญ์ œํ•œ ๊ฐ’์ด ๋‹ค๋ฅธ ํž™์—๋„ ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Map์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

  • Map์—๋Š” ๊ฐ ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ์–ด๋–ค ํž™์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ผ ๋•Œ, Map์„ ํ™•์ธํ•˜์—ฌ ์ด๋ฏธ ๋‹ค๋ฅธ ํž™์—์„œ ์†Œ์ง„๋œ ๊ฐ’์ด๋ผ๋ฉด ๋ฒ„๋ฆฌ๊ณ  ๋‹ค์‹œ ๊บผ๋‚ธ๋‹ค.
  • Map์—์„œ ๊ฐœ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด ํ•ด๋‹น ํ‚ค๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋‘ ํž™์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ›  delete ๋ฉ”์„œ๋“œ

delete() ๋ฉ”์„œ๋“œ๋Š” ํž™์—์„œ ๊ฐ’์„ ๊บผ๋‚ด๊ณ , ๊ทธ ๊ฐ’์ด ์œ ํšจํ•œ์ง€ Map์„ ํ™•์ธํ•œ ๋’ค ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • ํž™์—์„œ ํ•˜๋‚˜ ๊บผ๋‚ธ ํ›„, Map์—์„œ ํ•ด๋‹น ๊ฐ’์˜ ๋‚จ์€ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • ์ด๋ฏธ ๋‹ค๋ฅธ ํž™์—์„œ ๋ชจ๋‘ ์†Œ์ง„๋œ ๊ฐ’์ด๋ผ๋ฉด ๋ฒ„๋ฆฌ๊ณ (continue), ๋‹ค์‹œ ๊บผ๋‚ธ๋‹ค.
  • ์œ ํšจํ•œ ๊ฐ’์ด๋ผ๋ฉด Map์˜ ๊ฐœ์ˆ˜๋ฅผ 1 ์ค„์ด๊ฑฐ๋‚˜, 0์ด ๋˜๋ฉด ํ‚ค๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

์ฆ‰, delete() ๋ฉ”์„œ๋“œ๊ฐ€ ๋‘ ํž™๊ณผ Map์˜ ์ƒํƒœ๋ฅผ ์ผ์น˜์‹œ์ผœ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์ตœ๋Œ“๊ฐ’, ์ตœ์†Ÿ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

 


 

์ด ๋ฌธ์ œ๋Š” TreeMap์„ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐํ• ์ˆ˜๋„ ์žˆ๋‹ค.

 

๐Ÿ’ก TreeMap ํŠน์ง•

TreeMap์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(Red-Black Tree) ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

  • ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ๋ชจ๋‘ O(log N) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ๋”ฐ๋ผ์„œ, PriorityQueue์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํƒ์ƒ‰ ๋ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ TreeMap ํ•˜๋‚˜๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2๏ธโƒฃ TreeMap ์‚ฌ์šฉ

๊ธฐ์กด ๋ฐฉ์‹์—์„œ๋Š” ์ตœ์†Œํž™ + ์ตœ๋Œ€ํž™ ๋‘ ๊ฐœ์˜ ์šฐ์„ ์ˆœ์œ„ ํ, ์ค‘๋ณต ๊ฐœ์ˆ˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Map, ์ด ์„ธ ๊ฐ€์ง€๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ  TreeMap์€ ์ •๋ ฌ๋œ ์ƒํƒœ ์œ ์ง€ + Key-Value ๊ด€๋ฆฌ๋ฅผ ๋™์‹œ์— ์ œ๊ณตํ•˜๋ฏ€๋กœ, ์ด๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Key : ์ •์ˆ˜ ๊ฐ’
  • Value : ํ•ด๋‹น ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜ (์ค‘๋ณต ๊ฐœ์ˆ˜ ๊ด€๋ฆฌ)

์ด ๋ฌธ์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” TreeMap์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ๋ฅผ ์•Œ์•„๋ณด์ž.

  • firstKey() : ๊ฐ€์žฅ ์ž‘์€ Key(์ตœ์†Ÿ๊ฐ’) ๋ฐ˜ํ™˜
  • lastKey() : ๊ฐ€์žฅ ํฐ Key(์ตœ๋Œ“๊ฐ’) ๋ฐ˜ํ™˜
  • map.put(key, value) : ์ •์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฐฑ์‹ 
  • map.remove(key) : ํ•ด๋‹น Key์˜ ๊ฐœ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด ์ œ๊ฑฐ

์‚ญ์ œ ์—ฐ์‚ฐ ์‹œ์—๋Š”

  • ์ตœ๋Œ“๊ฐ’(lastKey()) ๋˜๋Š” ์ตœ์†Ÿ๊ฐ’(firstKey())์„ ์ฐพ๋Š”๋‹ค.
  • ํ•ด๋‹น Key์˜ ๊ฐœ์ˆ˜๋ฅผ 1 ์ค„์ธ๋‹ค.
  • ๊ฐœ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด remove()๋กœ ์™„์ „ํžˆ ์ œ๊ฑฐํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, TreeMap์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฝ์ž…/์‚ญ์ œ/ํƒ์ƒ‰์„ ๋ชจ๋‘ O(log N)์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๋ฉฐ ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ๋ฐ”๋กœ ์–ป์„ ์ˆ˜ ์žˆ์–ด ๊ตฌํ˜„์ด ํ›จ์”ฌ ๋‹จ์ˆœํ•ด์ง„๋‹ค.

 

์œ„ ํ’€์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ „์ฒด์ ์ธ ์ฝ”๋“œ๋ฅผ ๊ฐ๊ฐ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ฝ”๋“œ

1๏ธโƒฃ ์ตœ์†Œํž™, ์ตœ๋Œ€ํž™๊ณผ Map ์‚ฌ์šฉ

๋ฉ”๋ชจ๋ฆฌ : 444180KB
์‹œ๊ฐ„ : 2872ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static  Map<Integer, Integer> map;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        while (t --> 0) {
            int n = Integer.parseInt(br.readLine());

            PriorityQueue<Integer> min = new PriorityQueue<>();
            PriorityQueue<Integer> max = new PriorityQueue<>(Collections.reverseOrder());
            map = new HashMap<>();
            for (int i = 0; i < n; i++) {
                st = new StringTokenizer(br.readLine());
                char cmd = st.nextToken().charAt(0);
                int value = Integer.parseInt(st.nextToken());

                if (cmd == 'I') {
                    max.offer(value);
                    min.offer(value);

                    map.put(value, map.getOrDefault(value, 0)+1);
                } else { // D
                    if (map.size() == 0) continue;
                    else {
                        // 1 : ์ตœ๋Œ“๊ฐ’์„ ์‚ญ์ œ, -1 : ์ตœ์†Ÿ๊ฐ’์„ ์‚ญ์ œ
                        if (value == 1) delete(max);
                        else delete(min);
                    }
                }
            }

            if (map.isEmpty()) sb.append("EMPTY").append('\n');
            else {
                int ans = delete(max);
                sb.append(ans).append(" ");
                if (map.size() > 0)  ans = delete(min);
                sb.append(ans).append("\n");
            }
        }

        System.out.println(sb.toString());

        br.close();
    }

    private static int delete(PriorityQueue<Integer> pq) {
        int num;
        while (true) {
            num = pq.poll();

            int cnt = map.getOrDefault(num, 0);

            if (cnt == 0) continue; // ์ด๋ฏธ ๋‹ค๋ฅธ ํ์—์„œ ์†Œ์ง„๋œ ๊ฐ’์ด๋ฉด ๋ฒ„๋ฆฌ๊ณ  ๋‹ค์‹œ ๋ฝ‘๊ธฐ

            if (cnt == 1) map.remove(num); // ๋‚จ์€ ๊ฒŒ 1๊ฐœ๋ผ๋ฉด ์•„์˜ˆ ์ œ๊ฑฐ
            else map.put(num, cnt-1); // 2๊ฐœ ์ด์ƒ์ด๋ฉด ๊ฐœ์ˆ˜๋งŒ ์ค„์ž„

            break;
        }

        return num;
    }
}

2๏ธโƒฃ TreeMap ์‚ฌ์šฉ

๋ฉ”๋ชจ๋ฆฌ : 439824KB
์‹œ๊ฐ„ : 2340ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        while (t --> 0) {
            int n = Integer.parseInt(br.readLine());
            TreeMap<Integer, Integer> map = new TreeMap<>();
            for (int i = 0; i < n; i++) {
                st = new StringTokenizer(br.readLine());
                char cmd = st.nextToken().charAt(0);
                int value = Integer.parseInt(st.nextToken());

                if (cmd == 'I') {
                    map.put(value, map.getOrDefault(value, 0)+1);
                } else { // D
                    if (map.size() == 0) continue;
                    else {
                        // 1 : ์ตœ๋Œ“๊ฐ’์„ ์‚ญ์ œ, -1 : ์ตœ์†Ÿ๊ฐ’์„ ์‚ญ์ œ
                        int num = (value == 1) ? map.lastKey() : map.firstKey();
                        // num์˜ ๊ฐœ์ˆ˜๋ฅผ 1 ์ค„์ด๊ณ  (map.put(num, map.get(num) - 1))
                        // ๊ฐฑ์‹  ์ „ ๊ฐ’์ด 1์ด์—ˆ๋Š”์ง€ ํ™•์ธ (== 1)
                        if (map.put(num, map.get(num)-1) == 1) {
                            map.remove(num); // ๊ฐœ์ˆ˜๊ฐ€ 0์ด๋ฉด ์•„์˜ˆ ํ‚ค๋ฅผ ์ œ๊ฑฐ
                        }
                    }
                }
            }

            if (map.isEmpty()) sb.append("EMPTY").append('\n');
            else sb.append(map.lastKey()).append(" ").append(map.firstKey()).append("\n");
        }

        System.out.println(sb.toString());

        br.close();
    }
}

 

์ฒ˜์Œ ์šฐ์„ ์ˆœ์œ„ ํ + Map ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์„ ๋•Œ๋Š”, ๋‘ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋™์‹œ์— ๊ด€๋ฆฌํ•ด์•ผ ํ•ด์„œ ๋‹ค์†Œ ๋ณต์žกํ–ˆ๋‹ค. ์ดํ›„ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด TreeMap์œผ๋กœ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ๊ธฐ์กด ๋ฐฉ์‹์˜ ๊ธฐ๋Šฅ์„ TreeMap ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ, ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ง€๋‹Œ TreeMap์ด ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„ ์ธก๋ฉด์—์„œ๋„ ๋” ํšจ์œจ์ ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๐Ÿค”๐Ÿ’ก