๋„์ ๋„์  ์ฝ”๋”ฉ์ผ๊ธฐ

ํ•ฉ์ด ๊ฐ™์€ ๋ถ€๋ถ„์ง‘ํ•ฉ

์š”๋Œœ๋‹ค 2023. 1. 14. 17:33

๋ฌธ์ œ : 

N๊ฐœ์˜ ์›์†Œ๋กœ ๊ตฌ์„ฑ๋œ ์ž์—ฐ์ˆ˜ ์ง‘ํ•ฉ์ด ์ฃผ์–ด์ง€๋ฉด, ์ด ์ง‘ํ•ฉ์„ ๋‘ ๊ฐœ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ
๋‘ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์›์†Œ์˜ ํ•ฉ์ด ์„œ๋กœ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด “YES"๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด
”NO"๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.
๋‘˜๋กœ ๋‚˜๋‰˜๋Š” ๋‘ ๋ถ€๋ถ„์ง‘ํ•ฉ์€ ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์ด๋ฉฐ, ๋‘ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ํ•ฉํ•˜๋ฉด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์›๋ž˜์˜
์ง‘ํ•ฉ์ด ๋˜์–ด ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด {1, 3, 5, 6, 7, 10}์ด ์ž…๋ ฅ๋˜๋ฉด {1, 3, 5, 7} = {6, 10} ์œผ๋กœ ๋‘ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํ•ฉ์ด16์œผ๋กœ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.)

import sys
def DFS(L, sum):
    if sum>total//2:
        return
    if L==n:
        if sum==(total-sum):
            print("YES")
            sys.exit(0)
    else:
        DFS(L+1, sum+a[L])
        DFS(L+1, sum)


n=int(input())
a=list(map(int, input().split()))
total=sum(a)
DFS(0, 0)
print("NO")

DFS, BFS๋ฅผ ๊ณต๋ถ€ํ–ˆ์ง€๋งŒ, ๋ง‰์ƒ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค๋ฉด ์ ์šฉ ๋ชป ํ•  ๊ฒƒ ๊ฐ™๋‹ค.. ๊ทธ๋งŒํผ ์•„์ง ํ’€์–ด๋ณธ ๋ฌธ์ œ๊ฐ€ ์ ๋‹ค๋Š”๊ฑฐ๊ฒ ์ง€..

์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™•์‹คํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋”ฐ๋กœ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

์ธ๋ฑ์Šค๋ฅผ 1์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉฐ DFSํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด ๋ชจ๋“  ๊ฐ’์„ ํƒ์ƒ‰ํ•œ๋‹ค.

DFS ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” 2๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ์™€ ์„ ํƒํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋กœ ๋‚˜๋‰œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  sum ๊ฐ’์ด total//2 ๋ณด๋‹ค ํฌ๋ฉด returnํ•ด์ฃผ์–ด ๋น ์ ธ๋‚˜์˜จ๋‹ค. ๊ตณ์ด ์ด ์กฐ๊ฑด๋ฌธ์ด ์—†์–ด๋„ ๋‹ต์„ ์ฐพ๋Š”๋ฐ ๋ฌธ์ œ๋Š” ์—†์ง€๋งŒ, n์ด ํฌ๋ฉด ํด์ˆ˜๋ก ์‹œ๊ฐ„์„ ๋”์šฑ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

L == n (์ข…๋ฃŒ ์ง€์ ์ธ ๊ฒฝ์šฐ) and sum == total-sum (๋ถ€๋ถ„ ์ง‘ํ•ฉ์˜ ํ•ฉ์ด ์ดํ•ฉ์—์„œ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํ•ฉ์„ ๋บ€ ๋‚˜๋จธ์ง€์™€ ๊ฐ™์€ ๊ฒฝ์šฐ)์— YES๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๊ณ  ์ข…๋ฃŒํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์•„์ง ์‹ค๋ ฅ์€ ๋ถ€์กฑํ•˜์ง€๋งŒ ์žฌ๋ฏธ๋Š” ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.. ์–ผ๋ฅธ ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ํ’€์–ด ํฌ์—ด ๋А๋ผ๊ณ  ์‹ถใ„ท..

 

 

from itertools import combinations
from itertools import chain
lst = [10,20,30,40]
ans = []
for i in range(1,5):
  ans.append(list(map(list,combinations(lst, i))))

ans = list(chain(*ans))
print(ans)
res = []
for i in range(len(ans)):
  for j in range(i+1, len(ans)):
    if len(set(ans[j]) & set(ans[i])) == 0:
      if sum(ans[i]) == sum(ans[j]):
        print(i,ans[i], ans[j])
        res.append(sum(ans[i]))
  
print(res)