๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/SWEA

[Algorithm] SWEA : 1486. ์žฅํ›ˆ์ด์˜ ๋†’์€ ์„ ๋ฐ˜ by Python

by ํฌ๊ตฌ๋ฆฌ 2021. 2. 3.

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช…

์„œ์ ์—๋Š” ๋†’์ด๊ฐ€ B์ธ ์„ ๋ฐ˜์ด ์žˆ๋‹ค.

์ด ์„œ์ ์— ์žˆ๋Š” N๋ช…์˜ ์ ์›๋“ค์ด ์„ ๋ฐ˜ ์œ„์— ์˜ฌ๋ ค๋†“์€ ๋ฌผ๊ฑด์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ผ์ด ์ƒ๊ฒผ๋‹ค.

๊ฐ ์ ์›์˜ ํ‚ค๋Š” Hi๋กœ ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ, ์ ์›๋“ค์€ ํƒ‘์„ ์Œ“์•„์„œ ์„ ๋ฐ˜ ์œ„์˜ ๋ฌผ๊ฑด์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

์ ์›๋“ค์ด ์Œ“๋Š” ํƒ‘์€ ์ ์› 1๋ช… ์ด์ƒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

ํƒ‘์˜ ๋†’์ด๋Š” ์ ์›์ด 1๋ช…์ผ ๊ฒฝ์šฐ ๊ทธ ์ ์›์˜ ํ‚ค์™€ ๊ฐ™๊ณ , 2๋ช… ์ด์ƒ์ผ ๊ฒฝ์šฐ ํƒ‘์„ ๋งŒ๋“  ๋ชจ๋“  ์ ์›์˜ ํ‚ค์˜ ํ•ฉ๊ณผ ๊ฐ™๋‹ค.

ํƒ‘์˜ ๋†’์ด๊ฐ€ B ์ด์ƒ์ธ ๊ฒฝ์šฐ ์„ ๋ฐ˜ ์œ„์˜ ๋ฌผ๊ฑด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ํƒ‘์˜ ๋†’์ด๊ฐ€ ๋†’์„์ˆ˜๋ก ๋” ์œ„ํ—˜ํ•˜๋ฏ€๋กœ ๋†’์ด๊ฐ€ B ์ด์ƒ์ธ ํƒ‘ ์ค‘์—์„œ ๋†’์ด๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ํƒ‘์„ ์•Œ์•„๋‚ด๋ ค๊ณ  ํ•œ๋‹ค.

 

์ž…๋ ฅ

  • ์ฒซ ๋ฒˆ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋‘ ์ •์ˆ˜ N, B(1 ≤ N ≤ 20, 1 ≤ B ≤ S)๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค.
  • S๋Š” ๋‘ ๋ฒˆ์งธ ์ค„์—์„œ ์ฃผ์–ด์ง€๋Š” ์ ์›๋“ค ํ‚ค์˜ ํ•ฉ์ด๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ •์ˆ˜๋Š” ๊ฐ ์ ์›์˜ ํ‚ค Hi (1 ≤ Hi ≤ 10,000)์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ‘#t’(t๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ฒˆํ˜ธ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค)๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋†’์ด๊ฐ€ B ์ด์ƒ์ธ ํƒ‘ ์ค‘์—์„œ ํƒ‘์˜ ๋†’์ด์™€ B์˜ ์ฐจ์ด๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ฒƒ์„ ์ถœ๋ ฅํ•œ๋‹ค.


๐Ÿ’ก ๋ฌธ์ œ ํ’€์ด

์žฌ๊ท€ + ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ™œ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋‹ค.

 

step 1)
๋ณ€์ˆ˜ ์„ ์–ธ

  • numbers : ์ ์›๋“ค์˜ ํ‚ค๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด
  • res : ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ๋‹ด๋Š” ๋ณ€์ˆ˜ - ์ตœ์†Œ๊ฐ’์„ ์ฐพ์œผ๋ฏ€๋กœ ํฐ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”!
  • solve : ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ž‘์„ฑํ•œ (์žฌ๊ท€)ํ•จ์ˆ˜

step 2)
์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•˜์—ฌ ์ ์›๋“ค์ด ํƒ‘์„ ์Œ“์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ('์กฐํ•ฉ')๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ํ•จ์ˆ˜์˜ ์ธ์ž์— 0(์ธ๋ฑ์Šค), 0(ํ‚ค์˜ ์ดํ•ฉ)๊ฐ’์„ ๋„ฃ์–ด ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.
→ ์žฌ๊ท€์˜ ์ข…๋ฃŒ๋Š” ๋ฐฐ์—ด์„ ๋‹ค ํƒ์ƒ‰ํ–ˆ์„ ๋•Œ(n == N)์ด๋‹ค.

 

์ข…๋ฃŒ์‹œ์ ์— ์ด๋ฅด๊ธฐ ๊นŒ์ง€ ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด ํƒ์ƒ‰ํ•œ๋‹ค.

 

step 3)
์žฌ๊ท€์˜ ์ข…๋ฃŒ์‹œ์ ์ด ๋˜๋ฉด ํ‚ค์˜ ์ดํ•ฉ(total)์ด B๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํฐ์ง€ ํ™•์ธํ•œ๋‹ค.
๋™์‹œ์—, res์—๋Š” ํ‚ค์˜ ์ดํ•ฉ๊ณผ ์„ ๋ฐ˜์˜ ๋†’์ด(B)์ฐจ๊ฐ€ ์ตœ์†Œ์ธ ๊ฐ’์„ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.
์œ„์˜ ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด res์— total-B ๊ฐ’์„ ์ตœ์‹ ํ™”ํ•œ๋‹ค.

 

์ถ”๊ฐ€์ ์œผ๋กœ ์žฌ๊ท€๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ํ•˜์˜€๋‹ค. ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง„ํ–‰์ค‘์— total-B ๊ฐ’์ด res๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋ฉด returnํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

 

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

def solve(n, total):
    global N, B, res
    if n == N:
        if total >= B and res > total - B:
            res = total - B
        return
    if total - B >= res: return
    solve(n+1, numbers[n] + total)
    solve(n+1, total)

T = int(input())
for tc in range(T):
    N, B = map(int, input().split())
    numbers = list(map(int, input().split()))
    res = 0xffffff
    solve(0, 0)
    print('#{} {}'.format(tc+1, res))

 

๋Œ“๊ธ€