[BOJ] 2470. ๋‘ ์šฉ์•ก (๐Ÿฅ‡ , ์ด๋ถ„ํƒ์ƒ‰/ํˆฌ ํฌ์ธํ„ฐ)

lemythe423ยท2023๋…„ 5์›” 14์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
35/133
post-thumbnail

๋ฌธ์ œ

KOI ๋ถ€์„ค ๊ณผํ•™์—ฐ๊ตฌ์†Œ์—์„œ๋Š” ๋งŽ์€ ์ข…๋ฅ˜์˜ ์‚ฐ์„ฑ ์šฉ์•ก๊ณผ ์•Œ์นผ๋ฆฌ์„ฑ ์šฉ์•ก์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ ์šฉ์•ก์—๋Š” ๊ทธ ์šฉ์•ก์˜ ํŠน์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•˜๋‚˜์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ ธ์žˆ๋‹ค. ์‚ฐ์„ฑ ์šฉ์•ก์˜ ํŠน์„ฑ๊ฐ’์€ 1๋ถ€ํ„ฐ 1,000,000,000๊นŒ์ง€์˜ ์–‘์˜ ์ •์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , ์•Œ์นผ๋ฆฌ์„ฑ ์šฉ์•ก์˜ ํŠน์„ฑ๊ฐ’์€ -1๋ถ€ํ„ฐ -1,000,000,000๊นŒ์ง€์˜ ์Œ์˜ ์ •์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ฐ™์€ ์–‘์˜ ๋‘ ์šฉ์•ก์„ ํ˜ผํ•ฉํ•œ ์šฉ์•ก์˜ ํŠน์„ฑ๊ฐ’์€ ํ˜ผํ•ฉ์— ์‚ฌ์šฉ๋œ ๊ฐ ์šฉ์•ก์˜ ํŠน์„ฑ๊ฐ’์˜ ํ•ฉ์œผ๋กœ ์ •์˜ํ•œ๋‹ค. ์ด ์—ฐ๊ตฌ์†Œ์—์„œ๋Š” ๊ฐ™์€ ์–‘์˜ ๋‘ ์šฉ์•ก์„ ํ˜ผํ•ฉํ•˜์—ฌ ํŠน์„ฑ๊ฐ’์ด 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์šฉ์•ก์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ์–ด์ง„ ์šฉ์•ก๋“ค์˜ ํŠน์„ฑ๊ฐ’์ด [-2, 4, -99, -1, 98]์ธ ๊ฒฝ์šฐ์—๋Š” ํŠน์„ฑ๊ฐ’์ด -99์ธ ์šฉ์•ก๊ณผ ํŠน์„ฑ๊ฐ’์ด 98์ธ ์šฉ์•ก์„ ํ˜ผํ•ฉํ•˜๋ฉด ํŠน์„ฑ๊ฐ’์ด -1์ธ ์šฉ์•ก์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด ์šฉ์•ก์ด ํŠน์„ฑ๊ฐ’์ด 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์šฉ์•ก์ด๋‹ค. ์ฐธ๊ณ ๋กœ, ๋‘ ์ข…๋ฅ˜์˜ ์•Œ์นผ๋ฆฌ์„ฑ ์šฉ์•ก๋งŒ์œผ๋กœ๋‚˜ ํ˜น์€ ๋‘ ์ข…๋ฅ˜์˜ ์‚ฐ์„ฑ ์šฉ์•ก๋งŒ์œผ๋กœ ํŠน์„ฑ๊ฐ’์ด 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜ผํ•ฉ ์šฉ์•ก์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋„ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฐ์„ฑ ์šฉ์•ก๊ณผ ์•Œ์นผ๋ฆฌ์„ฑ ์šฉ์•ก์˜ ํŠน์„ฑ๊ฐ’์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด ์ค‘ ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์šฉ์•ก์„ ํ˜ผํ•ฉํ•˜์—ฌ ํŠน์„ฑ๊ฐ’์ด 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์šฉ์•ก์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋‘ ์šฉ์•ก์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์—๋Š” ์ „์ฒด ์šฉ์•ก์˜ ์ˆ˜ N์ด ์ž…๋ ฅ๋œ๋‹ค. N์€ 2 ์ด์ƒ 100,000 ์ดํ•˜์ด๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์šฉ์•ก์˜ ํŠน์„ฑ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ด ์ˆ˜๋“ค์€ ๋ชจ๋‘ -1,000,000,000 ์ด์ƒ 1,000,000,000 ์ดํ•˜์ด๋‹ค. N๊ฐœ์˜ ์šฉ์•ก๋“ค์˜ ํŠน์„ฑ๊ฐ’์€ ๋ชจ๋‘ ๋‹ค๋ฅด๊ณ , ์‚ฐ์„ฑ ์šฉ์•ก๋งŒ์œผ๋กœ๋‚˜ ์•Œ์นผ๋ฆฌ์„ฑ ์šฉ์•ก๋งŒ์œผ๋กœ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์ถœ๋ ฅ
์ฒซ์งธ ์ค„์— ํŠน์„ฑ๊ฐ’์ด 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์šฉ์•ก์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋‘ ์šฉ์•ก์˜ ํŠน์„ฑ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ๋‘ ์šฉ์•ก์€ ํŠน์„ฑ๊ฐ’์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค. ํŠน์„ฑ๊ฐ’์ด 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์šฉ์•ก์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ์—๋Š” ๊ทธ ์ค‘ ์•„๋ฌด๊ฒƒ์ด๋‚˜ ํ•˜๋‚˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

๋‘ ํฌ์ธํ„ฐ ๋ฌธ์ œ๋ผ๊ณ ํ•˜๋Š”๋ฐ ์ฒ˜์Œ ๋ดค์„ ๋•Œ ํˆฌ ํฌ์ธํ„ฐ๊ฐ€ ๋ญ”์ง€ ๋ชฐ๋ผ์„œ ์œ ํŠœ๋ธŒ์˜ ๋„์›€์„ ์ข€ ๋ฐ›์•˜๋‹ค. https://www.youtube.com/watch?v=ttLRltNDiCo

๋Œ€์ถฉ ๋‘ ๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์ •๋‹ต์— ์ ‘๊ทผํ•ด๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ํ‘ธ๋Š” ๊ฑฐ ๊ฐ™์•˜๋‹ค. ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋‹ค ํ’€์–ด๋ณด๋Š” ํ’€์ด

์กฐ๊ฑด

  1. ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์šฉ์•ก์„ ํ˜ผํ•ฉํ•˜๋Š”๊ฑฐ์ง€ ๋‘ ์šฉ์•ก์ด ๋ฐ˜๋“œ์‹œ ์•Œ์นผ๋ฆฌ์„ฑ / ์‚ฐ์„ฑ์ด์—ฌ์•ผ ํ•  ํ•„์š” ์—†๋‹ค. ์‚ฐ์„ฑ ๋‘ ์šฉ์•ก์„ ํ•ฉ์ณ๋„ 0์— ๊ฐ€๊น๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค
  2. 0์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ฐพ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šฐ๋ฉด ๋œ๋‹ค
  3. ์šฉ์•ก์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฐ’์ด 1,000,000,000์ด๋ฏ€๋กœ ์ตœ๋Œ€๊ฐ’ ์„ค์ •์„ 1e9๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ๋‚œ๋‹ค

ํˆฌ ํฌ์ธํ„ฐ

  • ์ •๋ ฌํ•˜๊ธฐ
    - ๋ง‰์—ฐํ•˜๊ฒŒ ๋‘ ์šฉ์•ก์ด๋ผ๊ธธ๋ž˜ ์‚ฐ์„ฑ/์•Œ์นผ๋ฆฌ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํž™ ์ •๋ ฌ์“ฐ๊ณ  ๋‚œ๋ฆฌ๋ฅผ ์น  ๋ป”ํ–ˆ๋Š”๋ฐ ๊ทธ๋Ÿฐ ๊ฑฐ ์ƒ๊ด€์—†๊ณ  0์— ๊ฐ€๊น๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ์˜€์Œ. ์ผ๋‹จ ์ •๋ ฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ’์„ ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ list ๋‘ ๋ฒˆ ๋Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด ์ •๋ ฌ์„ ํ•ด์ค€๋‹ค ํŒŒ์ด์ฌ์˜ sort() ๋ฉ”์„œ๋“œ๋Š” ์ตœ์„ ์˜ ๊ฒฝ์šฐ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง
  • ๊ฐ€์žฅ ์™ผ์ชฝ์„ left, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์„ right๋กœ ๋†“๊ณ  ๋‘ ๊ฐœ์˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ์กฐ์ •ํ•ด๊ฐ€๋ฉฐ ์ตœ์„ ์˜ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค. ์—ฌ๊ธฐ์„œ ์ตœ์„ ์˜ ๊ฐ’์€ ๋‘ ์šฉ์•ก ์ฐจ์ด์˜ ์ ˆ๋Œ€๊ฐ’์ด 0๊ณผ ๊ฐ€์žฅ ๊ทผ์ ‘ํ•œ ๊ฐ’
  • [-99, -4, -2, 1, 98] ๋กœ ์ •๋ ฌํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ๊ฐ€์žฅ ์™ผ์ชฝ์˜ -99์™€ ์˜ค๋ฅธ์ชฝ 98์„ ๋”ํ•˜๋ฉด -1์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. 0์— ๊ทผ์ ‘ํ•œ ๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๋ ๊นŒ? ์ƒ๊ฐํ•ด๋ณด๋ฉด ์Œ์ˆ˜ ๊ฐ’์˜ ์ ˆ๋Œ€๊ฐ’์ด ๋„ˆ๋ฌด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…์ ์œผ๋กœ ์Œ์ˆ˜ ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋œ ๊ฒƒ์ด๋ผ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ ์ •๋ ฌ๋œ ์ˆœ์„œ๋ฅผ ๋ดค์„ ๋•Œ left ๊ฐ’์„ +1ํ•˜๋ฉด ์Œ์ˆ˜์˜ ์ ˆ๋Œ€๊ฐ’์ด ์ค„์–ด๋“ค๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋ฐ˜๋Œ€๋กœ -4 + 98 = 95๋กœ ์ด๋ฒˆ์—” ์–‘์ˆ˜์˜ ์ ˆ๋Œ€๊ฐ’์ด ๋„ˆ๋ฌด ํฌ๋‹ค ์ฆ‰ right -= 1์„ ํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ
  • ๋‘ ์šฉ์•ก ์ฐจ์ด์˜ ์ ˆ๋Œ€๊ฐ’์€ ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๊ฒŒ ๋œ๋‹ค. ์–ด์จŒ๋“  ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌํ•ด๋‚˜๊ฐ€๋ฉด ์ ์–ด๋„ ์–‘์ˆ˜๋กœ๋งŒ ์ปค์ง€๊ฑฐ๋‚˜ ์Œ์ˆ˜๋กœ๋งŒ ์ปค์ง€์ง€๋Š” ์•Š๊ณ  0์œผ๋กœ ์ˆ˜๋ ดํ•˜๋Š”? ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค. ์‹ค์ œ๋กœ ๋„์ค‘์— ๊ตฌํ•ด์ง€๋Š” ์ฐจ์ด๊ฐ’์€ [-1, 96, 2,-3] ์˜€๋‹ค
  • ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋ฌด๋ฆฌ ๊ธธ์–ด๋„ O(N)์—์„œ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
    solution.sort()
    l, r = 0, N-1
    min_diff, min_sols = 1e13, []
    while l < r:
        tmp = solution[l] + solution[r]
        if abs(tmp) < min_diff:
            min_diff = abs(tmp)
            min_sols = [l, r]
        
        if tmp >= 0:
            r -= 1
        else:
            l += 1

์ด๋ถ„ํƒ์ƒ‰

ํ’€์ด ์ฐธ๊ณ 

  • ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ๋‚˜ ๋žœ์„  ์ž๋ฅด๊ธฐ ๊ฐ™์€ ์ด๋ถ„ํƒ์ƒ‰์ผ ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ „ํ˜€ ์•„๋‹ˆ์—ˆ๊ณ ... ๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ฅผ ๋Œ๋ฉด์„œ ๊ทธ ๊ฐ’์˜ ์™ผ์ชฝ์— ์žˆ๋Š” ๊ฐ’๋“ค ์ค‘์—์„œ ์ด๋ถ„ ํƒ์ƒ‰ํ•ด์„œ 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์›Œ์ง€๋Š” ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ์‹
  • ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ (N), ๋™์‹œ์— ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด๋ถ„ํƒ์ƒ‰๋„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—(logN) ์ „์ฒด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(NlogN)
  • mid ๊ฐ’์„ ์ฐพ์•„๋‚˜๊ฐ€๋ฉด์„œ๋„ ์ค‘๊ฐ„์— ๊ณ„์† min_diff๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ค˜์•ผ ํ•œ๋‹ค ์—ฌ๊ธฐ์„œ๋Š” ์ด๋ถ„ํƒ์ƒ‰์ด ๋๋‚˜๋„ ์ตœ์ข…์ ์œผ๋กœ ์ฐจ์ด๊ฐ€ 0์ด ๋˜๋Š” ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค
def sol(N, solution):
    solution.sort()
    
    min_sols, min_diff = [solution[0], solution[N-1]], 1e13
    for i in range(N-1):
        sol1 = solution[i]
        l, r, m = i+1, N-1, 0
        while l <= r:
            m = (l+r)//2
            tmp_sum = sol1+solution[m]

            if abs(tmp_sum) < min_diff:
                min_diff, min_sols = abs(tmp_sum), [sol1, solution[m]]
            if tmp_sum < 0:
                l = m+1
            else:
                r = m-1
    
    print(*min_sols)

N = int(input())
solution = list(map(int, input().split()))
sol(N, solution)

์ „์ฒด ์ฝ”๋“œ

ํˆฌ ํฌ์ธํ„ฐ

# 92ms

def sol(N, solution):

    solution.sort()
    l, r = 0, N-1
    min_diff, min_sols = 1e13, []
    while l < r:
        tmp = solution[l] + solution[r]
        print(tmp)
        if abs(tmp) < min_diff:
            min_diff = abs(tmp)
            min_sols = [l, r]
        
        if tmp >= 0:
            r -= 1
        else:
            l += 1

    print(solution[min_sols[0]], solution[min_sols[1]])

N = int(input())
solution = list(map(int, input().split()))
sol(N, solution)

์ด๋ถ„ํƒ์ƒ‰

def sol(N, solution):
    solution.sort()
    
    min_sols, min_diff = [solution[0], solution[N-1]], 1e13
    for i in range(N-1):
        sol1 = solution[i]
        l, r, m = i+1, N-1, 0
        while l <= r:
            m = (l+r)//2
            tmp_sum = sol1+solution[m]

            if abs(tmp_sum) < min_diff:
                min_diff, min_sols = abs(tmp_sum), [sol1, solution[m]]
            if tmp_sum < 0:
                l = m+1
            else:
                r = m-1
    
    print(*min_sols)

N = int(input())
solution = list(map(int, input().split()))
sol(N, solution)

๋ฐ˜๋ก€

3
-1 0 1

-1 1


4
-3 -1 1 10

-1 1


5
-100 -50 20 40 80

-50 40


4
-3 1 2 10

-3 2
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

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