Posts [알고리즘] 프로그래머스 - N으로 표현
Post
Cancel

[알고리즘] 프로그래머스 - N으로 표현


문제

숫자 N과 사칙연산만을 이용하여 number를 표현하라.
가능한 방법중 N을 가장 적게 사용하용하는 값을 반환하라.
ex) 12 = (55+5)/5 주어지는 숫자 : N
만들고자 하는 수 : number
N은 1이상 9 이하
number는 1이상 32,000 이하
나누기 연산의 나머지는 무시
최솟값이 8보다 크면 -1 리턴


입출력 예시

Nnumberreturn
5124
2113


접근

DP 문제이다.
주어지는 수 N을 1번만 사용한 경우부터 8번사용한 경우까지 찾아나가며 답이 없는 경우 -1을 리턴한다.
예를 들어 N이 2일 때, 한번 사용하는 경우는 {2} 한 가지 경우 뿐이다.
두 번부터는 이전의 연산 결과들을 이용한다.
두 번사용한 경우는 {22}와 한번 사용한 결과를 사칙연산한 경우들이 추가된다.
\(S[1] = {2}\)
\(S[2] = {22}, S[1] +-*/ S[1]\)
\(S[3] = {222}, S[2], S[1] +-*/ S[1], [2] ...\)
이런식으로 모든 조합을 탐색하면 된다.


코드

  • 파이썬 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(N, number):
    answer = -1
    s = [set() for x in range(8)]
    for i, x in enumerate(s, start=1):
        x.add(int(str(N)*i))
    for i in range(len(s)):
        for j in range(i):
            for op1 in s[j]:
                for op2 in s[i-j-1]:
                    s[i].add(op1 + op2)
                    s[i].add(op1 - op2)
                    s[i].add(op1 * op2)
                    if op2 != 0:
                        s[i].add(op1 // op2)
        if number in s[i]:
            answer = i+1
            break
    return answer


This post is licensed under CC BY 4.0 by the author.

[알고리즘] 프로그래머스 - 더 맵게

[알고리즘] 프로그래머스 - 여행경로