๋ฌธ์
https://www.acmicpc.net/problem/2295
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x13๊ฐ - ์ด๋ถํ์
์๊ณ ๋ฆฌ์ฆ: ์ด๋ถ ํ์, ํด์๋ฅผ ์ฌ์ฉํ ์งํฉ๊ณผ ๋งต
ํ์ด
N(5 ≤ N ≤ 1,000)๊ฐ์ ์์ฐ์๋ค๋ก ์ด๋ฃจ์ด์ง ์งํฉ U๊ฐ ์๋ค. ์ด ์ค์์ ์ ๋นํ ์ธ ์๋ฅผ ๊ณจ๋์ ๋, ๊ทธ ์ธ ์์ ํฉ d๋ U์์ ํฌํจ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ค ์ค์์, ๊ฐ์ฅ ํฐ d๋ฅผ ์ฐพ์ผ๋ผ.
์๋ฅผ ๋ค์ด {2, 3, 5, 10, 18}์ ๊ฐ์ ์งํฉ์ด ์๋ค๊ณ ํ์. 2+3+5 = 10์ด ๋๊ณ , ์ด ์๋ ์งํฉ์ ํฌํจ๋๋ค. ํ์ง๋ง 3+5+10 = 18์ด ๋๊ณ , ์ด ๊ฒฝ์ฐ๊ฐ ์ธ ์์ ํฉ์ด ๊ฐ์ฅ ์ปค์ง๋ ๊ฒฝ์ฐ์ด๋ค.
์ฐ๋ฆฌ๊ฐ x๋ฒ์งธ ์, y๋ฒ์งธ ์, z๋ฒ์งธ ์๋ฅผ ๋ํด์ k๋ฒ์งธ ์๋ฅผ ๋ง๋ค์๋ค๋ผ๊ณ ํ์. ์์ ์์ ์์ 2+3+5=10์ ๊ฒฝ์ฐ๋ x, y, z, k๊ฐ ์ฐจ๋ก๋ก 1, 2, 3, 4๊ฐ ๋๋ฉฐ, ์ต์ ํด์ ๊ฒฝ์ฐ๋ 2, 3, 4, 5๊ฐ ๋๋ค. k๋ฒ์งธ ์๊ฐ ์ต๋๊ฐ ๋๋๋ก ํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค. x, y, z, k๊ฐ ์๋ก ๊ฐ์๋ ๋๋ค. ์ด๋, k๋ฒ์งธ ์๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์งํฉ ๋ด์ ์์๋ฅผ ์ธ ๋ฒ ๊ณจ๋ผ์ ๋ํ๊ฐ์ด ์งํฉ์ ์กด์ฌํ๋๊ฒฝ์ฐ๋ฅผ ์ฐพ์์ผํ๋ค.
์ค๋ช ์ "x, y, z, k๊ฐ ์๋ก ๊ฐ์๋ ๋๋ค" ๋ผ๊ณ ๋์์๋๋ฐ, ๊ฐฏ์๋ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋จ์ ๋ช ์ฌํ์.
์๋ฅผ๋ค์ด ์งํฉ์ด {1, 1, 2, 6} ๋ก ๊ตฌ์ฑ๋๊ฒฝ์ฐ ์ต์ ํด๋ 2 + 2 + 2 = 6 ์ด ๋๋๊ฒ์ด๋ค.
์ฌ์ค ์๊ฐ์ด๊ณผ์ ์ด๋ง์ ๋ช๋ฒ ๋ดค๋ ๋ฌธ์ ๋ค.
์ฒ์ ์๋ํ๋ ๋ฐฉ๋ฒ์ ์งํฉ์ ์ ์ผ ํฐ๊ฐ์ k๋ก ์ค์ ํ๊ณ ํ๋์ฉ ์ค์ฌ๋๊ฐ๋ฉด์, ์ด์คfor๋ฌธ์ผ๋ก x, y๋ฅผ ์ ํ ํ ์ด๋ถํ์์ ํตํด z๋ฅผ ์ฐพ๋๊ฒ์ด์๋ค.
์ฌ๊ธฐ์ ํฐ ํ์ ๋ฐ๊พธ์ง ์์ ์ฑ ๋ํ ์ผ๋ง ์๋ดค์๊ณ ๊ฒฐ๊ตญ infinity TLE...โพ๏ธ
์ด๋ ๊ฒ ๋ช ๋ฒ ๊ณ ์ํ๋ค๊ฐ ์ฐพ์ ํด๋ต์ ์ด๋ฌํ๋ค.
- ๋ ์์ ํฉ์ set()์ ๋ฏธ๋ฆฌ ์ ์ฅํด๋๋ค.
- ์งํฉ U์ ๊ฐ์ฅ ํฐ ๊ฐ๋ถํฐ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ํํ๋ค. → k
- ๊ฐ k๋ง๋ค ์งํฉ์ ์์๋ฅผ ๋ค์ ์ํํ๋ค. → z
- k - z ์ ๊ฐ์ ์ด๋ถํ์์ ํตํด ์ฐพ๋๋ค. ์ด๋ ์ ๋ ฌ๋ set()์ ์ฌ์ฉํ๋ค.
k๋ ๊ฐ์ฅ ํฐ ๊ฐ๋ถํฐ ์์ํ๋ฏ๋ก ์ ์ผ ๋จผ์ ๋ฐ๊ฒฌ๋๋ k - z์๊ฐ์ด ๊ณง ๋ต์ด ๋๋๊ฒ์ด๋ค.
๋ํ ์ฃผ์ด์ง๋ ์์๋ค์ ๋ชจ๋ ์์ฐ์์ด๋ฏ๋ก k - z ๊ฐ ์์๋ผ๋ฉด ์ด๋ถํ์์ ์คํํ์ง ์๊ณ ๋ฐ๋ก ๋์ด๊ฐ๋ฉด๋๋ค.
๋ณด๋ฉด ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
๋จ, ์ฒซ๋ฒ์งธ๋ x, y๋ฅผ ๋งค๋ฒ ๋ํด์ค ๋ค z๋ฅผ ์ฐพ๋๊ฒ์ด์๊ณ ๋๋ฒ์งธ๋ z๋ฅผ ๊ธฐ์ค์ผ๋ก x+y๋ฅผ ์ฐพ๋๊ฒ์ด๋ฏ๋ก ์๊ฐ ์ฐจ์ด๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ญ์ ์ฌ๋์ ํจ์จ์ ์ผ๋ก ์ด์์ผํ๋ค.
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 71040KB / ์๊ฐ: 760ms
from sys import stdin
input = stdin.readline
N = int(input())
arr = sorted(int(input()) for _ in range(N))
two_sum = set() # ๋ ์๋ฅผ ๋ํ ๊ฐ๋ค์ ๋ฏธ๋ฆฌ ์ ์ฅํด๋ .
for i in range(N):
for j in range(i, N):
two_sum.add(arr[i] + arr[j])
two_sum = sorted(two_sum)
def binary_search(target):
start, end = 0, len(two_sum)-1
while start <= end:
mid = (start + end) // 2
if two_sum[mid] == target:
return True
elif two_sum[mid] < target:
start = mid + 1
else:
end = mid - 1
return False
def finding():
for k in range(N-1, -1, -1):
d = arr[k]
for i in range(N):
c = d - arr[i] # c = ๋ ์๋ฅผ ๋ํ ๊ฐ
if c <= 0:
continue
# ๋ง์ฝ c๊ฐ two_sum ๋ฆฌ์คํธ์ ์กด์ฌํ๋ค๋ฉด ์กฐ๊ฑด์ ๋ง์กฑํ๋ฏ๋ก ๋ฐ๋ก ๋ฐํ
if binary_search(c):
return d
print(finding())