Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- pandas
- 반복문
- 최소공배수
- HashSet
- 순열
- 쿼드압축 후 개수세기
- 튜플
- 후위 표기법
- 어려웠던 문제
- 조합
- Stack
- 동적계획법
- Java
- 알고리즘
- HashMap
- 프로그래머스
- 문자열
- 점프와 순간이동
- 완전탐색
- python
- 메뉴리뉴얼
- 완전 탐색
- 에라토스테네스의 체
- 영문자 확인
- 규칙찾기
- dfs
- Dynamic Programming
- fragment identifier
- 2017 카카오 코드
- 보이어무어
Archives
- Today
- Total
csmoon1010의 SW 블로그
[200424] 동적계획법(Dynamic Programming) - N으로 표현(level3) 본문
Coding Test/프로그래머스
[200424] 동적계획법(Dynamic Programming) - N으로 표현(level3)
csmoon1010 2020. 4. 24. 12:001. 문제이해
- Dynamic Programming : 복잡한 문제를 "작은 문제"로 나눠서 푸는 방법. "작은 문제"들이 중복되어 풀리게 됨
--> 주로 "재귀함수(recursive function)"을 많이 이용!!
① 하향식 알고리즘 : 문제푸는 순서는 큰 문제부터
② 상향식 알고리즘 : 문제푸는 순서는 작은 문제부터
- number를 N으로 이루어진 사칙연산식을 이용하여 표현. N의 개수의 최솟값 구하기
2. 전략
- makeNumber:
N으로 만들 수 있는 모든 number들을 담은 ArrayList를 return
사칙연산 : (1개, count-1개) ... (count-1개, 1개)로 나누어 사칙연산 후 ArrayList에 담기
반복숫자 : count의 개수만큼 반복된 숫자(ex> 555)를 ArrayList에 담기
- count가 1일 때부터 makeNumber를 호출하여 number와 같다면 answer!!
3. 참고사항
- number가 고정된 상태에서 N으로 구성하는 것은 어려움(여기서 헤맸다ㅠㅠ)
(이유1 : +와 *는 가능한 수의 범위가 정해져있지만 -와 /는 범위제한이 없음)
(이유2 : 큰문제, 작은문제의 기준이 모호함 _ number가 크다고해서 큰 문제는 아님
ex> 55 vs 12를 5로 나타내는 문제)
4. 코드
import java.util.*;
class Solution {
public int solution(int N, int number) {
int answer = 0;
ArrayList<Integer> resultList;
for(int i = 1; i <= 9; i++){
if(i==9){
answer = -1;
break;
}
resultList = makeNumber(N, i);
if(resultList.contains(number)){
answer = i;
break;
}
}
return answer;
}
public ArrayList<Integer> makeNumber(int N, int count){
ArrayList<Integer> resultList = new ArrayList<>();
for(int i = 1; i < count; i++){ //count일때 가능한 모든 경우의수
ArrayList<Integer> aList = makeNumber(N, i);
ArrayList<Integer> bList = makeNumber(N, count-i);
for(int a : aList){
for(int b : bList){
resultList.add(a+b);
resultList.add(a-b);
resultList.add(a*b);
if(b != 0) resultList.add(a/b);
}
}
}
String temp = "";
for(int i = 0; i < count; i++){
temp += N;
}
int repeatNum = Integer.parseInt(temp);
resultList.add(repeatNum);
return resultList;
}
}
'Coding Test > 프로그래머스' 카테고리의 다른 글
[200424] 이분탐색(Binary Search) - 예산(level3) (0) | 2020.04.24 |
---|---|
[200424] 동적계획법(Dynamic Programming) - 타일장식물(level3) (0) | 2020.04.24 |
[200421] 탐욕법(Greedy) - 섬 연결하기(level3) (0) | 2020.04.24 |
[200421] 탐욕법(Greedy) - 구명보트(level2) (0) | 2020.04.24 |
[200420] 힙 - 이중우선순위큐(level3) (0) | 2020.04.21 |
Comments