이것저것
프로그래머스 Level3 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
입출력 예 설명
예제 #1
문제에 나온 예와 같습니다.
예제 #2
11 = 22 / 2와 같이 2를 3번만 사용하여 표현할 수 있습니다.
출처
※ 공지 - 2020년 9월 3일 테스트케이스가 추가되었습니다.
풀이 과정
프로그래머스에서 DP문제라고 나와있어서 처음에 DFS문제 같은데 의아했었다.
그래도 DP로 풀어보려고했는데 잘 안되서 DFS로 그냥 풀었다...
최솟값이 8보다 크면 -1 로 리턴한다. 즉 숫자N은 최대 여덟번 사용 가능하다.
그래서 처음에는 DFS 코드를 이렇게 짰다.
void dfs(int index,int n,int target,int result){
if(index==8){
return;
}
if(result ==target){
answer = min(answer,index);
}
int newN = result*10+n;
dfs(index+1,n,target,result+n);
dfs(index+1,n,target,result-n);
dfs(index+1,n,target,result*n);
if(result/n!=0){
dfs(index+1,n,target,result/n);
}
dfs(index+1,n,target,newN);
}
이렇게 짰더니 테캐 4개가 계속 통과가 안됬다. 조금 더 생각해보니깐 5가 들어왔을 때 newN은 55가 되어 result인자값으로 넘어간다. 그리고 재귀를 하면 55+5, 55-5 등등이 인자로 넘어가진다.
이렇게 되면 한 숫자만 사용하는 것이 아니기 때문에 문제 조건에 부합하지 않는다.
그래서 dfs 부분을 수정했다
void dfs(int index,int n,int target,int result){
if(index>8){
return;
}
if(result ==target){
answer = min(answer,index);
}
int newN = 0;
for(int i=0;i<8;i++){
newN = newN*10+n;
dfs(index+i+1,n,target,result+newN);
dfs(index+i+1,n,target,result-newN);
if(result!=0){
dfs(index+i+1,n,target,result*newN);
dfs(index+i+1,n,target,result/newN);
}
}
}
이렇게 하면 애초에 55, 555, 5555... 만 인자로 넘어가기 때문에 잘 통과가 된다.
나누기나 곱하기 하는 부분은 0일 때는 판단할 필요가 없으므로 그 경우는 제외해주면 된다.
DP로 푸는 방법은 다음에 더 찾아봐야겠다...
소스 코드
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int answer = 9;
void dfs(int index,int n,int target,int result){
if(index>8){
return;
}
if(result ==target){
answer = min(answer,index);
}
int newN = 0;
for(int i=0;i<8;i++){
newN = newN*10+n;
dfs(index+i+1,n,target,result+newN);
dfs(index+i+1,n,target,result-newN);
if(result!=0){
dfs(index+i+1,n,target,result*newN);
dfs(index+i+1,n,target,result/newN);
}
}
}
int solution(int N, int number) {
dfs(0,N,number,0);
cout<<answer;
if(answer==9){
answer = -1;
}
return answer;
}
'Problem Solving' 카테고리의 다른 글
[2021 KAKAO BLIND RECRUITMENT] 합동 택시 요금 (0) | 2021.04.15 |
---|---|
프로그래머스 Level3 베스트앨범 (1) | 2021.03.03 |
BOJ - 13549. 숨바꼭질 3 (0) | 2021.02.23 |
프로그래머스 Level2 - 멀쩡한 사각형 (0) | 2021.02.22 |
프로그래머스 Level2 - 스킬트리 (0) | 2021.02.22 |