Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[DP] N으로 표현 - 프로그래머스 본문

프로그래밍

[DP] N으로 표현 - 프로그래머스

yesungcho 2022. 2. 2. 18:29

https://programmers.co.kr/learn/courses/30/lessons/42895

 

코딩테스트 연습 - N으로 표현

 

programmers.co.kr

 

이러한 DP 문제에서 경우의 수를 다루는 문제를 익혀야 한다...!

 

여기서도

5를 1번만 쓴 경우 만드는 경우의 수

[5]

5를 2번 쓴 경우 만드는 경우의 수

[55, (5+5), (5-5), (5/5), (5*5)]

이렇게 경우의 수를 생각해볼때

 

5를 3번 쓴 경우를 만드는 경우의 수는 다음과 같다

555를 먼저 추가해주고

[5] 와 [55, (5+5), (5-5), (5/5), (5*5)] 사이의 사칙연산 (+, -, /, *)

[55, (5+5), (5-5), (5/5), (5*5)] 와 [5] 사이의 사칙연산 (+, -, /, *)

이 렇게 부분적으로 문제를 풀 수 있다

즉 1번 경우의 수 X 2번 경우의 수 and 2번 경우의 수 X 1번 경우의 수 이다

여기서 이런 아이디어를 발견할 수 있냐는 거다

 

5를 4번 쓴 경우는 어떠할까

이는 다음과 같이 나타낼 수 있다

3번 경우의 수 X 1번 경우의 수

2번 경우의 수 X 2번 경우의 수

1번 경우의 수 X 3번 경우의 수

 

즉, 이러한 큰 문제를 작은 문제의 반복? 으로 나타낼 수 있다.

경우의 수 문제는

동전 문제도 그렇고

2원 짜리만 쓴 경우, 5원 짜리만 쓴 경우 ...

5를 1번 쓴 경우, 2번 쓴 경우 ...

 

작은 단위를 구하고

큰 단위를 추적하는 (점화식 마냥) 방법으로 이루어진다

 

import math
def solution(N, number): 
    if N == number : return 1
    dic = {}
    for i in range(1, 9) : 
        dic[i] = set()
    for i in range(1, 9) :
        if i == 1 : dic[i].add(N)
        if i >= 2 :
            if int(str(N)*i) == number : return i
            dic[i].add(int(str(N)*i))
            a = 1; b = i-1
            while a < i :
                for k in dic[a] :
                    for j in dic[b] :
                        if j+k == number : return i
                        if k != 0 :
                            if j // k == number : return i
                        if j - k == number : return i
                        if j * k == number : return i
                        dic[i].add(j+k)
                        if k != 0 :
                            dic[i].add(j//k)
                        dic[i].add(j-k)
                        dic[i].add(j*k)
                if a == b : pass
                for j in dic[a] : 
                    for k in dic[b] : 
                        if j + k == number : return i 
                        if k != 0 : 
                            if j // k == number : return i
                        if j - k == number : return i
                        if j * k == number : return i
                        dic[i].add(j + k)
                        if k != 0 : 
                            dic[i].add(j // k)
                        dic[i].add(j - k)
                        dic[i].add(j * k)
                a += 1
                b -= 1
            
    if number in dic[i] : return i
    else : return -1

'프로그래밍' 카테고리의 다른 글

[DP] 평범한 배낭 - 백준  (0) 2022.02.03
[DP] 설탕 배달 - 백준  (0) 2022.02.02
[DP] 동전 1 - 백준  (0) 2022.02.02
[DP] 정수 삼각형 - 프로그래머스  (0) 2022.02.02
[구현,시뮬레이션] 빗물 - 백준  (0) 2022.01.31