장 준
씨포유
장 준
전체 방문자
오늘
어제
  • 분류 전체보기 (91)
    • 프로그래밍언어 (15)
      • c언어 (10)
      • 파이썬 (0)
      • 자바스크립트 (5)
    • PS (58)
      • 알고리즘 이론 (18)
      • 프로그래머스 (5)
      • 백준 (35)
    • CS (16)
      • 자료구조 (5)
      • 운영체제 (3)
      • 네트워크 (5)
      • 데이터베이스 (0)
      • 기초 지식 (3)
    • 브랜드 (1)

블로그 메뉴

  • 태그

인기 글

태그

  • bitmask
  • codesandbox
  • 백준
  • 자료구조
  • Priority Queue
  • C
  • 자바스크립트
  • python3
  • DFS
  • DP
  • 기초 지식
  • 씨포유
  • recursion
  • Network
  • Stack
  • 알고리즘
  • pypy3
  • nodejs
  • 프로그래머스
  • PS
  • 프로그래밍언어
  • Implementation
  • BFS
  • 코딩테스트
  • JS
  • JavaScript
  • CS
  • Kruskal algorithm
  • Visual Studio
  • 파이썬

최근 댓글

최근 글

hELLO · Designed By 정상우.
장 준

씨포유

[프로그래머스(Programmers)/ Level3] N으로 표현 (파이썬, Python3)
PS/프로그래머스

[프로그래머스(Programmers)/ Level3] N으로 표현 (파이썬, Python3)

2022. 7. 6. 14:43
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 number return
5 12 4
2 11 3

 


입출력 예 설명

 

예제 #1
문제에 나온 예와 같습니다.

 

예제 #2
11 = 22 / 2와 같이 2를 3번만 사용하여 표현할 수 있습니다.

 


문제 풀이

 

 저는 이 문제를 동적계획법(Dynamic Programming) 알고리즘을 사용해서 풀었습니다.

 

2022.07.22 - [알고리즘/개념] - [파이썬으로 배우는 알고리즘] 동적 계획법(Dynamic Programming)

 

[파이썬으로 배우는 알고리즘] 동적 계획법(Dynamic Programming)

동적 계획법(Dynamic Programming)이란? 동적 계획법(Dynamic Programming), 다이나믹 프로그래밍, DP라고 불리는 이 알고리즘은 무엇일까요?? 동적 프로그래밍? 저는 이 말을 처음 접했을 때 의미에 대해 생

c4u-rdav.tistory.com

 

N이 5라고 가정하고, 문제를 풀어보겠습니다.

 

1) N을 1 개 사용해서 나타낼 수 있는 수들을 구한다.

 5

 

 

2) N을 2 개 사용해서 나타낼 수 있는 수들을 구한다.

 55, 10(5 + 5), 0(5 - 5), 1(5 / 5), 25(5 * 5)

 

 

3) N을 3 개 사용해서 나타낼 수 있는 수들을 구한다.

 555, 15(5 + 5 + 5), 5(5 + 5 - 5), 6(5 + 5 / 5), 31(5 + 5 * 5),.... 

 

 

 

여기서 무슨 규칙이 보이거나 생각나지 않나요?

 

바로 N을 3개 사용해서 나타낼 수 있는 수는

(N을 1개 사용해서 나타낼 수 있는 수) 연산 (N을 2개 사용해서 나타낼 수 있는 수),
(N을 2개 사용해서 나타낼 수 있는 수) 연산 (N을 1개 사용해서 나타낼 수 있는 수)

로 나타낼 수 있다는 것입니다.

 

따라서 N을 n개 사용해서 나타낼 수 있는 수는

 

(N을 k개 사용해서 나타낼 수 있는 수) 연산 (N을 n-k개 사용해서 나타낼 수 있는 수) (1 <= k < n)

로 나타낼 수 있습니다.

 


구현

코드

def solution(N, number):
    dp  = [set([int(str(N)*i)]) for i in range(1, 9)] 
    
    # N 사용 횟수
    for i in range(8):
        for j in range(i):
            # j 개
            for num1 in dp[j]:
                # i-j 개
                for num2 in dp[i-j-1]:
                    dp[i].add(num1 + num2)
                    dp[i].add(num1 - num2)
                    dp[i].add(num1 * num2)
                    if num2 != 0:
                        dp[i].add(num1//num2)
        # number가 연산한 결과에 있으면 답으로 반환
        if number in dp[i]:
            return i+1 
    return -1

결과

728x90
반응형
저작자표시 (새창열림)

'PS > 프로그래머스' 카테고리의 다른 글

[프로그래머스(Programmers)/ Level2] N개의 최소공배수 (파이썬, Python3)  (0) 2022.07.01
[프로그래머스(Programmers)/ Level3] 블록 이동하기 (파이썬, Python3)  (0) 2022.06.30
[프로그래머스(Programmers)/ Level2] 기능개발 (파이썬, Python3)  (0) 2022.06.30
[프로그래머스(Programmers)/ Level2] 구명보트 (파이썬, Python3)  (0) 2022.06.29
    'PS/프로그래머스' 카테고리의 다른 글
    • [프로그래머스(Programmers)/ Level2] N개의 최소공배수 (파이썬, Python3)
    • [프로그래머스(Programmers)/ Level3] 블록 이동하기 (파이썬, Python3)
    • [프로그래머스(Programmers)/ Level2] 기능개발 (파이썬, Python3)
    • [프로그래머스(Programmers)/ Level2] 구명보트 (파이썬, Python3)
    장 준
    장 준
    C4U(Computer For You)

    티스토리툴바