[BOJ][๐ŸŸก5][๋ฐฑ์ค€#02294] ๋™์ „ 2

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #2294


๋ฌธ์ œ

n๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋™์ „์ด ์žˆ๋‹ค. ์ด ๋™์ „๋“ค์„ ์ ๋‹นํžˆ ์‚ฌ์šฉํ•ด์„œ, ๊ทธ ๊ฐ€์น˜์˜ ํ•ฉ์ด k์›์ด ๋˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ ๋™์ „์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ๋™์ „์€ ๋ช‡ ๊ฐœ๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉํ•œ ๋™์ „์˜ ๊ตฌ์„ฑ์ด ๊ฐ™์€๋ฐ, ์ˆœ์„œ๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์€ ๊ฐ™์€ ๊ฒฝ์šฐ์ด๋‹ค.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— n, k๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 โ‰คย n โ‰ค 100, 1 โ‰ค k โ‰ค 10,000) ๋‹ค์Œ n๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ์˜ ๋™์ „์˜ ๊ฐ€์น˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.ย ๋™์ „์˜ ๊ฐ€์น˜๋Š” 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ฐ€์น˜๊ฐ€ ๊ฐ™์€ ๋™์ „์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ฃผ์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.


์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์‚ฌ์šฉํ•œ ๋™์ „์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์ž…๋ ฅ

3 15
1
5
12


์ถœ๋ ฅ

3


My Sol

from collections import deque

def main():
    def BFS():
        Q = deque()
        dp = [0]*(T+1)
        for coin in coins:
            if coin > T: continue
            dp[coin] = 1
            Q.append(coin)

        while Q:
            acc = Q.popleft()
            for coin in coins:
                ssum = acc+coin
                if ssum > T: continue
                if dp[ssum]: continue
                dp[ssum] = dp[acc]+1
                Q.append(ssum)
        return dp[T] if dp[T] else -1

    N, T = map(int, input().split())
    coins = sorted(list(set([int(input()) for _ in range(N)])), reverse=True)
    return BFS()

print(main())

๋‹น์—ฐํžˆ DP ๋ฌธ์ œ์ผ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ๋ฌธ์ œ ํ•ด๊ฒฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ œ์‹œ์—๋„ DP๋กœ ํ•ด๊ฒฐํ•˜๋ผ๊ณ  ๋‚˜์™€์žˆ๋Š”๋ฐ, ๋‚˜๋Š” BFS๋ฅผ ์ด์šฉํ•ด ํ’€์—ˆ๋‹ค.

image

๋‚˜๋ฆ„ 2,835๋ช… ์ค‘ ์—ฐ์‚ฐ์‹œ๊ฐ„ 9๋“ฑ์ด๋‹ˆ ๊ทธ๋ฆฌ ๋‚˜์œ ์ฝ”๋“œ๋Š” ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. (์‹ฌ์ง€์–ด ๋‚˜๋ณด๋‹ค ์—ฐ์‚ฐ์‹œ๊ฐ„์ด ๋” ๋น ๋ฅธ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋“ค์€ ๋ชจ๋‘ BFS๋กœ ํ’€์—ˆ์Œ์„ ํ™•์ธํ–ˆ๋‹ค.)


  1. ์ž…๋ ฅ์„ ๋ฐ›๊ณ , ์ œ์‹œ๋œ ๋™์ „๋“ค์„ set์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ๋’ค, list, sorted-reversed๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.
  2. ๋ชฉํ‘œ๊ฐ’์ธ T๋ณด๋‹ค ํฌ์ง€ ์•Š์€ ๋™์ „๋“ค ์„ ์—์„œ deque์— ๋™์ „๋“ค์„ ์ง‘์–ด๋„ฃ๊ณ , ์ด๋ฅผ ํ™•์ธํ•˜๋Š” dp ๋ฐฐ์—ด์— ํ‘œ์‹œํ•œ๋‹ค.
  3. ๋™์ „ ํฌ๊ธฐ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ ์ด์ „ deque์— ๋„ฃ์€ ๋ˆ„์  ๊ธˆ์•ก์— ๋Œ€ํ•ด ๋™์ „๋“ค์„ ๊ฐ๊ฐ ๋Œ€์ž…ํ•ด ์นด์šดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ฆ‰, ํ•ด๋‹น ๊ธˆ์•ก์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฏธ dp ๋ฐฐ์—ด์— ํŠน์ • ๊ธˆ์•ก์— ํŠน์ • ๊ฐ’์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ๊ธˆ์•ก์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๊ฐœ์ˆ˜์ด๋ฏ€๋กœ ์ด๋ฏธ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๋„˜์–ด๊ฐ„๋‹ค. ์ฆ‰, visited์˜ ์—ญํ• ์„ ํ•˜๋Š” ๋ฐฐ์—ด์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ dp๋ผ๊ณ  ์ด๋ฆ„ ๋ถ™์ธ ์ด์œ ๋Š” ์ด์ „์— DP๋กœ ํ’€์—ˆ๋˜ ๊ธฐ๋ก ๋•Œ๋ฌธโ€ฆใ…Žใ…Ž ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ๊ณผ์ •์—์„œ ๋ˆ„์  ๊ธˆ์•ก์ด T๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๋ถ„๊ธฐ์ฒ˜๋ฆฌํ•ด์„œ ๋„˜์–ด๊ฐ„๋‹ค.
  4. ๋ชจ๋“  ์ˆœํšŒ๋ฅผ ๋งˆ์น˜๊ณ  dp[T]์˜ ๊ฐ’์„ returnํ•˜๋Š”๋ฐ, ์ด๋•Œ ๊ฐ’์ด 0์ด๋ฉด ์ดˆ๊ธฐ๊ฐ’์ด๊ณ , ํ•ด๋‹น ๋ˆ„์ ๊ธˆ์•ก์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ