JS Star 블로그

기억보다는 기록을✏️ 머신러닝, 웹개발, 물리학을 공부했고 계속 배워가고 있습니다.
📌 기존에 포스팅하던 블로그에서 포스트를 옮기는 중입니다.

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

12 Sep 2020 » algorithm

N으로 표현

문제

아래와 같이 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	number	return
5	12	4
2	11	3

풀이

규칙을 찾아내는 것이 중요하다. 위 규칙을 이용해 5로 만들 수 있는 숫자를 구해보자. 사칙연산 중 나누기의 나머지는 무시한다.

N = 1일 때, 5

N = 2일 때, 5+5 5-5 5*5 5/5, 55

N = 3일 때, 5+(5+5) 5-(5+5) 5*(5+5) 5/(5+5) 5+55

N = 4일 때, 5+(5+(5+5)) 5-(5-(5+5))(5+5)+(5+5) (5+5)-(5+5)

N=4 은 N=1과 N=3의 경우의 수 모두를 각각 사칙연산하고, N=2과 N=2의 경우의 수 모두를 각각 사칙연산한 것이다. 이 규칙대로라면 N=5 은 N=1과 N=4의 경우의 수, N=2과 N=3의 경우의 수 모두를 각각 사칙연산한 것이다.

  • N_i을 만든다. N_i[1]은 N=1인 경우의 수, N_i[2]은 N=2인 경우의 수를 담아 둔 것이다.
  • N=4은 1+3, 2+2로 만들고 N=5은 1+4, 2+3로 만들고 N=6은 1+5, 2+4, 3+3로 만드는 loop을 만든다.
  • N_i[n]을 통해 앞에 저장해둔 경우의 수를 꺼내와 연산할 수 있다.
  • 각 사칙연산을 계산하고 tmp라는 list에 집어넣고 모두 계산이 끝나면 N_i에 넣는다.
def solution(N, number):
    # 1개만 사용해서 표현가능 할 때
    if N == number:
        return 1
    
    # N=i 일 때 경우의 수
    N_i = []
    N_i.append([N])   # N=1 입력
    
    for n in range(2, 9):
        # n까지 숫자 중 절반까지만 계산
        tmp = []
        tmp.append(int(str(N)*n))
        for i in range(1, n//2+1):
            # 더해서 N을 만들 수 있는 수 (4=3+1, 4=2+2)
            for y in N_i[i-1]:
                for x in N_i[n-i-1]:      # 빼기와 나누기는 앞뒤 관계 영향 O
                    tmp.append(y+x)
                    tmp.append(y-x)
                    tmp.append(x-y)
                    tmp.append(x*y)
                    if x != 0:
                        tmp.append(y//x)
                    if y != 0:
                        tmp.append(x//y)

        if number in tmp:
            return n
        N_i.append(tmp)

    return -1