ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

14225번: λΆ€λΆ„μˆ˜μ—΄μ˜ ν•©

μˆ˜μ—΄ Sκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μˆ˜μ—΄ S의 λΆ€λΆ„ μˆ˜μ—΄μ˜ ν•©μœΌλ‘œ λ‚˜μ˜¬ 수 μ—†λŠ” κ°€μž₯ μž‘μ€ μžμ—°μˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 예λ₯Ό λ“€μ–΄, S = [5, 1, 2]인 κ²½μš°μ— 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 λ§Œλ“€ οΏ½

www.acmicpc.net

 

문제 풀이

 μ΄ λ¬Έμ œλŠ” 주어진 μˆ˜μ—΄μ˜ λΆ€λΆ„ 합을 κ΅¬ν•˜μ˜€μ„ λ•Œ, ꡬ할 수 μ—†λŠ” 수λ₯Ό λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 예제 μž…λ ₯ 1μ—μ„œ ꡬ할 수 μžˆλŠ” 경우의 수λ₯Ό 트리둜 λ²—λŠ”λ‹€λ©΄ μœ„μ˜ κ·Έλ¦Όκ³Ό κ°™λ‹€. 즉 주어진 μˆ˜μ—΄μ„ λͺ¨λ‘ μ„ νƒν•˜λŠ” κ²½μš°μ™€ λΆ€λΆ„μ μœΌλ‘œ μ„ νƒν•˜μ§€ μ•Šμ„ λ•Œμ— 따라 합을 κ΅¬ν•˜λ©΄ λ˜λŠ” 것이닀.

 μ΄λ₯Ό μ½”λ“œλ‘œ κ΅¬ν˜„ν•œλ‹€λ©΄ μž¬κ·€ ν˜ΈμΆœμ„ μ΄μš©ν•˜λ©΄ μ‰½κ²Œ ꡬ할 수 μžˆλ‹€. μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒκ³Ό 같은 경우의 수λ₯Ό μƒκ°ν•˜μ—¬ κ΅¬ν˜„ν•˜λ©΄ λœλ‹€.

 

  • 쀑간에 λ°œμƒν•˜λŠ” 값도 κΈ°λ‘ν•˜μ—¬μ•Ό ν•˜κΈ°μ—, μΈλ±μŠ€κ°€ N에 μ΄λ£¨λŠ” 경우만 값을 μ €μž₯ν•˜μ§€ μ•Šκ³  가지λ₯Ό 뻗을 λ•Œλ§ˆλ‹€ λΆ€λΆ„ 합을 κΈ°λ‘ν•œλ‹€.
  • μž¬κ·€ ν˜ΈμΆœμ„ ν•  λ•Œ, ν˜„μž¬ 인덱슀의 값을 λ°˜μ˜ν•˜λŠ” 것과 ν•˜μ§€ μ•ŠλŠ” 것 2κ°€μ§€λ‘œ λ‚˜λˆ„μ–΄ μž¬κ·€ ν˜ΈμΆœμ„ ν•œλ‹€.

 

μ½”λ“œ

from sys import stdin


def dfs(idx, sum_num):
    global answer

    if idx == n:
        return

    answer.add(sum_num + s[idx])
    dfs(idx + 1, sum_num + s[idx])
    dfs(idx + 1, sum_num)


if __name__ == '__main__':
    n = int(stdin.readline())
    s = list(map(int, stdin.readline().split(' ')))
    answer = set(s[:])
    dfs(0, 0)

    ret = 0
    for num in range(max(answer)):
        if num + 1 not in answer:
            ret = num + 1
            break

    print(ret if ret else max(answer) + 1)

 λΉ μ§„ 수λ₯Ό μ°ΎκΈ° μœ„ν•΄μ„œλŠ” κ΅¬ν•œ κ°’μ—μ„œ maxκΉŒμ§€μ˜ 수λ₯Ό 순차적으둜 νƒμƒ‰ν•˜κ³  λκΉŒμ§€ νƒμƒ‰ν•˜μ—¬λ„ 찾지 λͺ»ν•œ κ²½μš°λŠ” max + 1 값을 λ°˜ν™˜ν•˜λ„λ‘ ν•˜μ˜€λ‹€.

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€