https://school.programmers.co.kr/learn/courses/30/lessons/42895?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

[문제 요약]
숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하는 solution
def solution(N, number):
dp = [set() for i in range(9)]
for i in range(1, 9):
dp[i].add(int(str(N)*i))
for j in range(0, i):
for k in dp[j]:
for l in dp[i-j]:
dp[i].add(k+l)
dp[i].add(k-l)
dp[i].add(k*l)
if k !=0 and l !=0: dp[i].add(k//l)
if number in dp[i]: return i
return -1
[해결 방법]
- 작은 문제부터 해결하여 그 값이 있으면 연산하지 않고 그걸 참고하는 bottom-up 방식
- N을 사용 횟수의 최댓값이 8이므로 8개의 집합 생성
- 0부터 8까지 9개의 집합을 생성하긴 했지만, 필요 X
- N 사용 횟수가 2번이면 NN, N+N, N-N, N*N, N/N 연산한 값이 집합에 들어감
- ex) N이 3개면 NNN, (N=1 값 + N=2 값), (N=1 값 - N=2 값), (N=1 값 * N=2 값), (N=1 값 / N=2 값), (N=2 값 + N=1 값), (N=2 값 - N=1 값), (N=2 값 * N=1 값), (N=2 값 / N=1 값)
- N이 i개일 때 연산값을 추가했다면, 해당 집합에서 number 발견 시 i return 후 종료
- N 사용 횟수의 최솟값을 구하는 건데 bottom-up 방식을 사용해 1부터 시작했기 때문에 빨리 발견 될수록 사용 횟수가 적은 것이라 판단
- for문을 다 돌아도 number 발견하지 못하면 N의 최대 사용 횟수인 8번이 넘은 것이므로 -1 retrurn
'코딩테스트 > Programmers' 카테고리의 다른 글
| 평균 일일 대여 요금 구하기 (MySQL) (0) | 2024.01.08 |
|---|---|
| [1차] 캐시 (JS) (0) | 2023.12.13 |
| 완주하지 못한 선수 (Python) (0) | 2023.07.25 |
| A로 B 만들기 (Python) (0) | 2023.07.21 |
| 숨어있는 숫자의 덧셈 (2) (Python) (0) | 2023.07.17 |