ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 15658 μ—°μ‚°μž λΌμ›Œλ„£κΈ° (2) with Python
    PS 2022. 2. 2. 17:56
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 15658 μ—°μ‚°μž λΌμ›Œλ„£κΈ° (2)

    πŸ’‘ 쑰건

    1. N개의 수둜 이루어진 μˆ˜μ—΄ A1, A2, ..., AN
      N(2 ≀ N ≀ 11), (1 ≀ Ai ≀ 100)

    2. μž…λ ₯ 값쀑 μ…‹μ§Έ 쀄에 4N보닀 μž‘κ±°λ‚˜ 같은 4개의 μ •μˆ˜κ°€ μ£Όμ–΄μ§€λŠ”λ°,
      μ°¨λ‘€λŒ€λ‘œ λ§μ…ˆ(+)의 개수, λΊ„μ…ˆ(-)의 개수, κ³±μ…ˆ(Γ—)의 개수, λ‚˜λˆ—μ…ˆ(Γ·)의 κ°œμˆ˜μ΄λ‹€.

    3. μˆ˜μ™€ 수 사이에 μ—°μ‚°μžλ₯Ό ν•˜λ‚˜μ”© λ„£μ–΄μ„œ, μˆ˜μ‹μ„ ν•˜λ‚˜ λ§Œλ“€ 수 μžˆλ‹€. μ΄λ•Œ, 주어진 수의 μˆœμ„œλ₯Ό λ°”κΎΈλ©΄ μ•ˆ λœλ‹€.

    4. μ‹μ˜ 계산은 μ—°μ‚°μž μš°μ„  μˆœμœ„λ₯Ό λ¬΄μ‹œν•˜κ³  μ•žμ—μ„œλΆ€ν„° 진행해야 ν•œλ‹€.

    5. λ‚˜λˆ—μ…ˆμ€ μ •μˆ˜ λ‚˜λˆ—μ…ˆμœΌλ‘œ λͺ«λ§Œ μ·¨ν•œλ‹€. λ˜ν•œ 음수λ₯Ό λ‚˜λˆŒ λ•Œμ—λŠ” μ–‘μˆ˜λ‘œ λ°”κΎΌ λ’€ λͺ«μ„ μ·¨ν•˜κ³ , κ·Έ λͺ«μ„ 음수둜 λ°”κΎΈμ–΄μ•Ό ν•œλ‹€.

    6. λ°±νŠΈλž˜ν‚Ή, DFS μ•Œκ³ λ¦¬μ¦˜ μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin, setrecursionlimit
    setrecursionlimit(10 ** 6)
    
    n = int(stdin.readline())
    n_num = list(map(int, stdin.readline().split()))
    arr = list(map(int, stdin.readline().split()))
    
    
    def dfs(num, val):
        global max_res, min_res
        if not num:
            max_res = max(val, max_res)
            min_res = min(val, min_res)
            return
        else:
            for i in range(4):
                if i == 0:
                    if arr[i] > 0:
                        arr[i] -= 1
                        dfs(num[1:], val + num[0])
                        arr[i] += 1
                    else:
                        continue
    
                if i == 1:
                    if arr[i] > 0:
                        arr[i] -= 1
                        dfs(num[1:], val - num[0])
                        arr[i] += 1
                    else:
                        continue
    
                if i == 2:
                    if arr[i] > 0:
                        arr[i] -= 1
                        dfs(num[1:], val * num[0])
                        arr[i] += 1
                    else:
                        continue
    
                if i == 3:
                    if arr[i] > 0:
                        arr[i] -= 1
                        if val < 0:
                            temp = abs(val) // num[0] * -1
                        else:
                            temp = val // num[0]
                        dfs(num[1:], temp)
                        arr[i] += 1
                    else:
                        continue
    
    
    max_res = -int(1e9)
    min_res = int(1e9)
    dfs(n_num[1:], n_num[0])
    print(max_res, min_res, sep='\n')

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    6
    1 2 3 4 5 6
    3 2 1 1

    μ‹€ν–‰κ²°κ³Ό

    72
    -48

    ⌨️ 문제 풀이

    1. DFS μ•Œκ³ λ¦¬μ¦˜κ³Ό λ°±νŠΈλž˜ν‚Ήμ„ μ΄μš©ν•œ 문제 풀이λ₯Ό ν–ˆλ‹€.

    2. DFS에 λ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄κ°€λŠ” val 의 값은 μˆ˜μ—΄μ˜ μˆœμ„œλ₯Ό λ°”κΎΈλ©΄ μ•ˆλ˜κΈ° λ•Œλ¬Έμ— 무슨 짓을 해도 μˆ˜μ—΄[0] 의 κ°’κ³Ό κ°™λ‹€.

    3. DFS에 λ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄κ°€λŠ” num은 μž…λ ₯받은 μˆ˜μ—΄μ˜ index 1λ²ˆλΆ€ν„° λ“€μ–΄κ°€λ©΄ λœλ‹€.

    4. DFSκ°€ μ’…λ£Œλ˜λŠ” μ‹œμ μ€ num μ΄λΌλŠ” λ¦¬μŠ€νŠΈκ°€ λΉ„μ–΄μžˆμ„ λ•Œμ΄λ©° 이 λ•Œ, μ΅œλŒ“κ°’κ³Ό μ΅œμ†Ÿκ°’μ„ κ°±μ‹ ν•˜λ©΄μ„œ μ’…λ£Œλœλ‹€.
      μ΅œλŒ“κ°’μ€ -int(1e9), μ΅œμ†Ÿκ°’μ€ int(1e9)이닀.

    5. arr λ¦¬μŠ€νŠΈλŠ” 각각 λ§μ…ˆ(+), λΊ„μ…ˆ(-), κ³±μ…ˆ(Γ—), λ‚˜λˆ—μ…ˆ(Γ·)의 개수이며, μž…λ ₯으둜 λ°›λŠ”λ‹€.

    6. λ§Œμ•½ DFSκ°€ λ„˜κ²¨λ°›λŠ” num λ¦¬μŠ€νŠΈκ°€ λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄, λ°˜λ³΅λ¬Έμ„ 0λΆ€ν„° 3κΉŒμ§€ λ°˜λ³΅μ„ ν•œλ‹€.
      λ°˜λ³΅ν•˜λ©΄μ„œ, 각 i 의 μˆ«μžμ— 따라 arr[i]의 값이 0보닀 클 λ•Œ, val λ³€μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” 연산을 ν•΄μ€€ λ’€, μž¬κ·€ν˜ΈμΆœμ„ ν•œλ‹€.

    7. μž¬κ·€ν˜ΈμΆœμ„ ν•  λ•Œ, num[1:] 을 λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨μ£Όμ–΄ 쀑볡 계산을 λ°©μ§€ν•œλ‹€.
      μ΄λ ‡κ²Œ μž¬κ·€ν˜ΈμΆœμ„ ν•˜κ²Œ 되면 λ„˜κ²¨μ£ΌλŠ” λ¦¬μŠ€νŠΈλŠ” 길이가 μ•žμ—μ„œλΆ€ν„° ν•˜λ‚˜μ”© μ—†μ–΄μ§€κ²Œ λ˜λŠ”λ°,
      μž¬κ·€ 호좜 μ „, arr[i]λ₯Ό -1 ν•΄μ£Όκ³  μž¬κ·€ 호좜 ν›„ +1 ν•΄μ€€λ‹€.

    πŸ’Ύ λŠλ‚€μ 

    1. λ‹¨μˆœνžˆ permutations ν˜Ήμ€ combinations 둜 풀지 μ•Šμ•˜κ³ ,
      μ •ν™•ν•˜κ²Œ DFS 및 λ°±νŠΈλž˜ν‚Ήμ„ ν™œμš©ν•˜μ—¬ ν’€μ΄ν–ˆλŠ”λ°, 이것이 Nκ³Ό M μ‹œλ¦¬μ¦ˆλ₯Ό ν‘ΈλŠ”λ°μ— 쒋은 μ—°μŠ΅μ΄ 됐닀.
    2. 쑰건이 크게 μ—†μ—ˆμ§€λ§Œ, division errorλ₯Ό 쑰심해야 ν–ˆκ³ ,
      음수일 κ²½μš°μ— λ‚˜λˆ—μ…ˆμ˜ 방식이 쑰금 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— κ°„λ‹¨ν•œ 쑰건 μΆ”κ°€ν•˜λŠ” κ²ƒλ§Œ μ‘°μ‹¬ν•˜λ©΄ λ˜λŠ” λ¬Έμ œμ˜€λ˜ 것 κ°™λ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.