๋ฐ์ํ
๐ฑ ๋ฌธ์
๐ฑ ํ์ด
2470๋ฒ ๋ ์ฉ์ก์ ์ ๊ทธ๋ ์ด๋ ๋ฒ์ ์ ๋๋ค. ๋ฌธ์ ๋ ๊ฐ๊ณ ์ฉ์ก๋ง 3๊ฐ๋ฅผ ๊ณ ๋ฅด๋ฉด ๋ฉ๋๋ค. ํฌ์ธํฐ๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ๋ ๋ ํ์ํ๋ฐ, ์ฉ์ก์ ๊ฐ์๊ฐ 3๋ถํฐ 5000์ผ๋ก ๊ทธ๋ฆฌ ํฌ์ง ์์ต๋๋ค. ๊ทธ๋์ for๋ฌธ์ผ๋ก
1. ์ ๋ ฅ๋ฐ๊ธฐ
n = int(input())
liquid = sorted(list(map(int, input().split())))
์ ๋ ฅ์ ๋ ์ค์ด ์ฃผ์ด์ง๋๋ค. ์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ฉ์ก์ ์์ธ n์ ์ ๋ ฅ๋ฐ๊ณ , ๋์งธ ์ค์์๋ ์ฉ์ก์ ํน์ฑ๊ฐ๋ค์ธ n๊ฐ์ ์ ์๋ค์ ๋ฆฌ์คํธ๋ก ์ ๋ ฅ๋ฐ์ต๋๋ค. ์ด๋, ๋ฆฌ์คํธ๋ ์ ๋ ฌ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
2. ๋ณ์ ์ด๊ธฐํ
result = []
min = sys.maxsize
min
์ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํฉ์ ์ ๋๊ฐ ์ค ์ต์๊ฐ์ ๋ด๋ ๋ณ์์ ๋๋ค. ํฌ ํฌ์ธํฐ๋ฅผ ์กฐ์ํ ๋๋ง๋คmin
๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ์ ์์ต๋๋ค.start
์end
๋liquid
๋ฆฌ์คํธ์ ๋ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ ํฌ์ธํฐ์ ํด๋นํฉ๋๋ค.liquid
๋ฆฌ์คํธ๋ฅผ ์ด๋ฏธ ์ ๋ ฌํด์ฃผ์์ผ๋ฏ๋ก ์ ์ชฝ ๋์์ ์์ํ์ฌ ๋ฒ์๋ฅผ ์ค์ฌ๊ฐ๋๋ค.result
๋ ์ถ๋ ฅํ ๊ฒฐ๊ณผ ๊ฐ์ ๋ด๋ ๋ฆฌ์คํธ์ ๋๋ค.min
์ด ์ ๋ฐ์ดํธ๋ ๋๋ง๋คresult
๋ ์ ๋ฐ์ดํธ ๋ฉ๋๋ค.
3. ํ๋ ๊ณ ์ + ํฌ ํฌ์ธํฐ
for i in range(n - 2):
start = i + 1
end = n - 1
while start < end:
mix = liquid[i] + liquid[start] + liquid[end]
if abs(mix) < min:
min = abs(mix)
result = [liquid[i], liquid[start], liquid[end]]
if mix < 0:
start += 1
elif mix > 0:
end -= 1
else:
break
- ํ๋์ ์ฉ์ก์ ๊ณ ์ ์ํค๊ณ for๋ฌธ ์์์
start
์end
๋ก ํฌ ํฌ์ธํฐ๋ฅผ ์กฐ์ํฉ๋๋ค.start
๋ ๊ณ ์ ๋ ์ฉ์ก์ ๋ค์ ์ฉ์ก๋ถํฐ ์์ํ๋ฉฐ,end
๋ ๋ง์ง๋ง ์ฉ์ก์ ๊ฐ๋ฆฌํต๋๋ค. start
์end
๊ฐ ๋ง๋๊ธฐ ์ ๊น์ง ๋ฐ๋ณตํ๋ฉฐ, ๋ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํฉ์ด 0์ด ๋๋ฉด ๋ฐ๋ณต๋ฌธ์ ์ฆ์ ์ข ๋ฃํฉ๋๋ค.mix
๋ ๋ ์ฉ์ก์ ํน์ฑ๊ฐ์ ํฉํ ๊ฐ์ ๋ด๊ณ ์์ต๋๋ค.- ์ฐ๋ฆฌ์ ๋ชฉํ๋
mix
์ ์ ๋๊ฐ์ด 0๊ณผ ๊ฐ์ฅ ๊ฐ๊น๋๋ก ํ๋ ๋ ์ฉ์ก์ ์ ํํ๋ ๊ฒ์ด๋ฏ๋กmix
์ ์ ๋๊ฐ์ ํ์ฌmin
๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ ์๋ค๋ฉดmin
๊ณผresult
๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. mix
๊ฐ์ด ์์๋ผ๋ฉด ํฌ ํฌ์ธํฐ ์กฐ์ ์,start
๋ฅผ 1 ์ฆ๊ฐ์์ผ ์ดํ ๊ณ์ฐ๋mix
๊ฐ์ ์ฆ๊ฐ์์ผ 0์ ๊ฐ๊น๋๋ก ํฉ๋๋ค. ๋ฐ๋๋กmin
๊ฐ์ด ์์๋ผ๋ฉด ํฌ ํฌ์ธํฐ ์กฐ์ ์,end
๋ฅผ 1 ๊ฐ์์์ผmix
๊ฐ์ด 0์ ๊ฐ๊น๋๋ก ํฉ๋๋ค. ์ด๋ฐ์์ผ๋ก ๋ฒ์๋ฅผ ์ค์ฌ๊ฐ๋ฉด์start
๊ฐend
๋ฅผ ๋ง๋๊ธฐ ์ ๊น์ง while๋ฌธ์ ๋ฐ๋ณตํฉ๋๋ค.mix
๊ฐ์ด 0์ด๋ผ๋ฉด ๋์ด์ ๊ฐ์ ํ ์ฌํญ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํฉ๋๋ค.
๐ฑ ์ ๋ต ์ฝ๋
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# boj 2460 ์ธ ์ฉ์ก
import sys
input = sys.stdin.readline
n = int(input())
liquid = sorted(list(map(int, input().split())))
result = []
min = sys.maxsize
start = 1
end = n - 1
for i in range(n - 2):
start = i + 1
end = n - 1
while start < end:
mix = liquid[i] + liquid[start] + liquid[end]
if abs(mix) < min:
min = abs(mix)
result = [liquid[i], liquid[start], liquid[end]]
if mix < 0:
start += 1
elif mix > 0:
end -= 1
else:
break
print(*result)
์ ์ฝ๋๋ฅผ python3์ผ๋ก ์ ์ถํ๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋์ต๋๋ค๐ PyPy3๋ก ์ ์ถํ์ ๋๋ ์๊ฐ ์ด๊ณผ ์์ด ์ ๋ต์ด ๋ฉ๋๋ค!
๋ฐ์ํ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #2230 ์ ๊ณ ๋ฅด๊ธฐ (Python) (0) | 2023.02.14 |
---|---|
[BOJ] #9935 ๋ฌธ์์ด ํญ๋ฐ (Python) (0) | 2023.02.13 |
[BOJ] #2470 ๋ ์ฉ์ก (Python) (0) | 2023.02.13 |
[BOJ] #2178 ๋ฏธ๋ก ํ์ (BFS, Python) (0) | 2023.02.10 |
[BOJ] #11401 ์ดํญ๊ณ์3 (Python) (0) | 2023.02.07 |
๋๊ธ