๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ Algorithm/์•Œ๊ณ ๋ฆฌ์ฆ˜-Python

[์•Œ๊ณ ๋ฆฌ์ฆ˜/Python] BOJ 1182 ๋ถ€๋ถ„์ˆ˜์—ด์˜ ํ•ฉ

by Danna 2021. 4. 21.
728x90
728x90

๐Ÿ‘‰ 1182 ๋ถ€๋ถ„์ˆ˜์—ด์˜ ํ•ฉ

 

1182๋ฒˆ: ๋ถ€๋ถ„์ˆ˜์—ด์˜ ํ•ฉ

์ฒซ์งธ ์ค„์— ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” N๊ณผ ์ •์ˆ˜ S๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) ๋‘˜์งธ ์ค„์— N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ์ •์ˆ˜์˜ ์ ˆ๋Œ“๊ฐ’์€ 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค.

www.acmicpc.net

๐Ÿ‘€ ์ ‘๊ทผ :: 

  • N๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘์—์„œ ์›์†Œ๋ฅผ ๋‹ค ๋”ํ•œ ๊ฐ’์ด S๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. 
  • ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ์ž„์„ ์•Œ๊ณ  ์ ‘๊ทผํ–ˆ๊ธฐ์— DFS ๋กœ ๊นŠ์ด ํƒ์ƒ‰์„ ํ•˜๋ฉด์„œ ์กฐ๊ฑด์„ ์ฒดํฌํ–ˆ๋‹ค. 
๋ฐฑํŠธ๋ž˜ํ‚น? ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, DFS ๋กœ ๊นŠ์ด ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๊ฐ ๋ฃจํŠธ์— ๋Œ€ํ•ด ์กฐ๊ฑด์„ ์ฒดํฌํ•œ๋‹ค. ๋งŒ์•ฝ, ํ•ด๋‹น ํŠธ๋ฆฌ์— ์กฐ๊ฑด์ด ๋งž์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ํŠธ๋ฆฌ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•œ๋‹ค.

โœ”๏ธŽ ๋ฌธ์ œ ํ’€์ด ๋ฐฉ๋ฒ•

  • ๋ถ€๋ถ„ ์ˆ˜์—ด์€ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • 1์ฐจ์› ๋ฐฐ์—ด์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ–ˆ๋‹ค.
  • ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์ด S๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ, ์ •๋‹ต์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผฐ๋‹ค.

 

โœ”๏ธŽ ์‹ค์ˆ˜ํ–ˆ๋˜ ๋ถ€๋ถ„

1. ๋ฐ˜๋ณตํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ N์ด ๋˜์—ˆ์„ ๋•Œ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ๋„๋‹ฌํ•˜์ง€ ์•Š์•„๋„ "๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ" ์ด๋ฏ€๋กœ ์ •๋‹ต์— ํ•ด๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. "๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ"์ด S๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

๋‹ค์Œ ๊ฒฝ์šฐ์—์„œ ์ •๋‹ต์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ [3], [3, -3, 3], [3] ์œผ๋กœ ์„ธ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜จ๋‹ค.

0๋ฒˆ์งธ ์ธ๋ฑ์Šค์—์„œ ํ•ฉ์ด 3์ด ๋˜์—ˆ๋‹ค๊ณ  ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•˜๊ฒŒ๋˜๋ฉด ์ „์ฒด ์ง‘ํ•ฉ์˜ ๊ฒฝ์šฐ๋Š” ํฌํ•จ๋˜์ง€ ๋ชปํ•œ๋‹ค. (์Œ์ˆ˜๊ฐ€ ์กฐ๊ฑด์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.)

3 3
3 -3 3

 

๐Ÿ‘ฉ‍๐Ÿ’ป Python ์ฝ”๋“œ

from sys import stdin
input = stdin.readline

n, s = map(int, input().split())
nums = list(map(int, input().split()))
result = 0

def dfs(i, graph, total):
    global result, s, n
    if total == s:
        result += 1
    
    # graph (๋ถ€๋ถ„์ˆ˜์—ด) ๋งŒ๋“ค๊ธฐ
    for j in range(i+1, n):
        dfs(j, graph, total + graph[j])

for i in range(0, n):
    dfs(i, nums, nums[i])

print(result)
728x90
728x90