Algorithm/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / Python] N으둜 ν‘œν˜„

meeeeejin 2021. 4. 6. 15:36

문제 링크: programmers.co.kr/learn/courses/30/lessons/42895

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - N으둜 ν‘œν˜„

 

programmers.co.kr

 

 

문제 μ„€λͺ…

μ²˜μŒμ—” number에 λŒ€ν•œ dp ν…Œμ΄λΈ”μ„ μƒμ„±ν•΄μ„œ 문제λ₯Ό ν’€λ €ν–ˆλŠ”λ°, 그게 μ•„λ‹ˆλΌ N의 μ‚¬μš© νšŸμˆ˜μ— λŒ€ν•œ dp ν…Œμ΄λΈ”μ„ μ΄μš©ν•΄ 문제λ₯Ό ν•΄κ²°ν•΄μ•Ό ν–ˆλ‹€. λ¬Έμ œμ—μ„œ μ΅œμ†Ÿκ°’μ΄ 8보닀 클 경우 -1을 λ°˜ν™˜ν•œλ‹€κ³  λ‚˜μ™€μžˆμœΌλ―€λ‘œ N을 8번 μ‚¬μš©ν•˜λŠ” κ²½μš°κΉŒμ§€λ§Œ κ³„μ‚°ν•˜λ©΄ λœλ‹€. 

 

N을 i번 μ‚¬μš©ν•˜λŠ” 경우 λ§Œλ“€ 수 μžˆλŠ” 수:

   - NNN...N (N이 i번 λ°˜λ³΅λ˜λŠ” 경우)

   - (N을 1번 μ‚¬μš©ν•œ 수) 사칙연산 (N을 i - 1번 μ‚¬μš©ν•œ 수)

   - (N을 2번 μ‚¬μš©ν•œ 수) 사칙연산 (N을 i - 2번 μ‚¬μš©ν•œ 수)

   ...

   - (N을 i - 1번 μ‚¬μš©ν•œ 수) 사칙연산 (N을 1번 μ‚¬μš©ν•œ 수)

 

 

이처럼 N을 1번 μ‚¬μš©ν•˜λŠ” 것뢀터 8번 μ‚¬μš©ν•˜λŠ” κ²½μš°κΉŒμ§€λ₯Ό 각 집합에 λ„£κ³ , λ§Œμ•½ numberκ°€ ν•΄λ‹Ή μ§‘ν•©μ˜ μ›μ†ŒλΌλ©΄ iλ₯Ό λ°˜ν™˜ν•˜λ©΄ λœλ‹€. 

 

 

 

 

μ†ŒμŠ€μ½”λ“œ

from collections import defaultdict

def solution(N, number):
	# dp[i]: N을 i번 μ‚¬μš©ν•΄μ„œ λ§Œλ“€ 수 μžˆλŠ” μˆ˜λ“€μ˜ μ§‘ν•©
    dp = defaultdict(set)

    for i in range(1, 9):
        dp[i].add(int(str(N) * i))  # NNN...N
        for j in range(1, i):
            for n1 in dp[j]:
                for n2 in dp[i - j]:
                    dp[i].add(n1 + n2)
                    dp[i].add(n1 - n2)
                    dp[i].add(n1 * n2)
                    if n2 != 0: dp[i].add(n1 // n2)  # 0으둜 λ‚˜λˆŒ 수 μ—†μŒ

        if number in dp[i]: return i # N을 i번 μ‚¬μš©ν•΄μ„œ numberλ₯Ό λ§Œλ“€ 수 있음

    return -1 # μ΅œμ†Ÿκ°’μ΄ 8λ²ˆλ³΄λ‹€ 클 경우

 

 

 

728x90