코딩테스트/프로그래머스

[프로그래머스 Level3] N으로 표현 - 파이썬(Python)

yejin72 2023. 1. 12. 16:46
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다.

12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5

5를 사용한 횟수는 각각 6,5,4입니다. 그리고 이중 가장 작은 경우는 4입니다.
이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현할 수 있는 방법 중 N 사용 횟수의 최솟값을 return 하도록 solution 함수를 작성하세요.

 

제한사항

  • N은 1 이상 9 이하입니다.
  • number는 1 이상 32,000 이하입니다.
  • 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
  • 최솟값이 8보다 크면 -1을 return 합니다.

 

 


N=5라면, 다음의 방법들이 가능하다.

N 사용 횟수 (cnt) 1 2 3 ...
표현할 수 있는 방법 5 55, 5+5, 5-5, 5*5, 5//5 555, 5+(5+5), 5-(5-5), (5-5)-5, 5*(5*5), 5//(5//5), (5//5)//5 ...

 이 때, N을 cnt번 사용해서 표현할 수 있는 방법들은 N을 cnt번 이어 붙인 숫자들과, 0~(cnt // 2 + 1) 중 하나를 i라고 했을 때 i번째 N의 사용으로 표현할 수 있는 방법들과, (cnt - i) 번째 N의 사용으로 표현할 수 있는 방법들을 사칙연산으로 계산한 결과들을 모은 것이다.

N을 cnt번 사용해서 표현할 수 있는 방법들 중 number가 있다면 현재의 N의 개수를 반환한다.

 

cnt의 최솟값은 8보다 클 수 없으므로 1~8까지의 cnt번 N이 사용된 결과물들 중 number가 없다면 -1을 반환한다.

 

 

 

 << 최종 코드 >>

def solution(N, number):
    dp = [set() for _ in range(9)]
    for cnt in range(1, 9):
        dp[cnt].add(int(str(N) * cnt))
        for i in range(cnt//2 + 1):
            for left in dp[i]:
                for right in dp[cnt-i]:
                    dp[cnt].add(left + right)
                    dp[cnt].add(left - right)
                    dp[cnt].add(right - left)
                    dp[cnt].add(left * right)
                    if right != 0:
                        dp[cnt].add(left // right)
                    if left != 0:
                        dp[cnt].add(right // left)
        if number in dp[cnt]:
            return cnt
    return -1

 

728x90