[프로그래머스] N으로 표현, 파이썬

Jung Seo Kyung·2019년 12월 30일
1

문제 설명 >

아래와 같이 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
number: 12
return 4

풀이 🧐

  • 결과로 N 사용횟수를 return 해야하므로 N 사용 횟수에 따라 집합을 만들고 만들 수 있는 숫자들을 저장한다.
  • 다음 단계로 넘어가기 전, 집합 속에 number가 있다면 해당 단계를 return 한다.
  • 8 단계까지만 확인하면 되기 때문에, 경우의 수가 엄청 많지는 않다.

예를 들어
N이 두 번 사용된 N = 2 집합은

  • N = 1
  • N = 1

의 조합에 의해서 만들 수 있다.

N = 3인 집합은,

  • N = 1
  • N = 2
    조합에 의해서 만들 수 있다.
    N=2, N=1 는 앞의 경우와 중복됨을 알 수 있다. 즉 만들고자 하는 사용 횟수 집합 크기의 절반까지 확인한다.
def solution(N, number):
    S = [0, {N}]
    for i in range(2, 9):
        case_set = {int(str(N)*i)}
        for i_half in range(1, i//2+1):  # S[i_half] S[1]
            for x in S[i_half]:
                for y in S[i-i_half]:
                    case_set.add(x+y)
                    case_set.add(x-y)
                    case_set.add(y-x) # y-x 케이스 추가
                    case_set.add(x*y)
                    if x != 0:
                        case_set.add(y//x)
                    if y != 0:
                        case_set.add(x//y)
        if number in case_set:
            return i
        S.append(case_set)
    return -1


print(solution(2, 11))

4개의 댓글

comment-user-thumbnail
2020년 1월 28일

오 잘보고있습니다! 한가지 궁금한게있네요.

N = 3인 집합은,

N = 1
N = 2
조합에 의해서 만들 수 있다.
N=2, N=1 는 앞의 경우와 중복됨을 알 수 있다. 즉 만들고자 하는 사용 횟수 집합 크기의 절반까지 확인한다.

여기 부분에서, 예를들어 N=1, N=1, N=1 이렇게도 계산을 할수있지 않을가요? 그런부분이 어디에 명시되어있는지 궁금합니다.

1개의 답글
comment-user-thumbnail
2020년 8월 11일

잘보고 갑니다.
혹시 실례가 안된다면 제가 공부용으로 운영하는 블로그에 코드를 포스팅해도 될까요?
출처는 반드시 명시하겠습니다.

답글 달기
comment-user-thumbnail
2020년 11월 16일

현재 테스트 케이스가 추가되었습니다.
N == 1일때와 N == number일때를 예외처리해주어야합니다.
저는 if N == 1 or n == number: return N % number + 1 구문을 추가해주었습니다.

답글 달기