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
- 순열코드
- char to str
- 자바
- 자바 재귀 조합
- Interface
- 알고리즘
- jquery 속성선택자
- Java
- java lambda
- 순열 재귀
- 후위표기
- 서로소
- 자바스크립트 이벤트중지
- jquery dom 계층 선택자
- java 내부 클래스
- jquery 필터선택자
- str to char array
- 상속
- 자바 순열 코드
- 자바입출력
- inner class
- 재귀함수
- java Collections.sort()
- 재귀
- parseInt()
- 알고리즘 그래프
- jquery 이벤트 처리
- 조합 재귀
- 자바스크립트 이벤트처리
- 자바 조합 재귀
Archives
- Today
- Total
유블로그
[Java] swea 1952 수영장 본문
[Java] swea 1952 수영장
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 모의SW_1952_수영장 {
static int[] prices = new int[4];
static int[] myPlan = new int[12];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int testcase = 1; testcase <= T; testcase++) {
MIN = Integer.MAX_VALUE;
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
prices[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 12; i++) {
myPlan[i] = Integer.parseInt(st.nextToken());
}
MIN = prices[3];
solve(0, 0);
System.out.println("#" + testcase + " " + MIN);
} // tc
} // main
static int MIN;
private static void solve(int curMonth, int cost) {
if(cost >= MIN) return;
if(curMonth >= 12) {
if(MIN > cost) MIN = cost;
return;
}
solve(curMonth+1, cost + (myPlan[curMonth] * prices[0]));
solve(curMonth+1, myPlan[curMonth] == 0? cost : cost+prices[1]);
solve(myPlan[curMonth] == 0? curMonth+1 : curMonth+3, myPlan[curMonth] == 0? cost :cost + prices[2]);
} // solve
}
옛날엔 못풀었었나...? 한참 뒤에 풀었었나..? 그랬었던 문제..
일종의 DP느낌...? 인 듯..???
1월부터 시작해서 (난 인덱스를 0부터 잡아서 0~11이다.) 12월까지
각 달에 1일권, 1달권, 3달권 모두 시도해본다.
이 때 1년 이용권 한 번 사용하는 것을 MIN 금액으로 둔다.
1일권을 사용하는 경우 그 달의 이용날 * 1일권 금액을 더해서 재귀 month+1 해서 한 번 호출.
1달권을 사용하는 경우 그 달의 이용날이 0일이라면 금액이 더해지지 않고 그냥 month+1 해서 호출.
그 달의 이용날이 1일 이상이라면 금액에 1달권금액을 더하고 month+1 해서 호출.
3달권을 사용하는 경우 그 달의 이용날이 0일이라면 3달권 사용하지 않고 그냥 month+1 해서 호출.
그 달의 이용날이 1일 이상이라면 3달권금액더하고 month+3 해서 호출.
그러니까 함수 한 번 호출에 3번의 재귀를 들어간다.
종료 조건은 month가 12가 될 떄 ! (0~11 이므로)
그 때의 cost 를 MIN과 비교하여 MIN을 업데이트하면 된다.
이 때!! 함수 처음 호출할 때 cost 와 MIN을 비교하여 이미 cost가 MIN과 같거나 크다면 불필요한 진행이므로 그냥 return 하여 더이상 함수진행을 막는다!
'알고리즘' 카테고리의 다른 글
[Java] BOJ 20056 마법사 상어와 파이어볼 (0) | 2021.04.23 |
---|---|
[Java] swea 1949 등산로조성 (0) | 2021.04.22 |
[Java] swea 2382 미생물격리 (0) | 2021.04.22 |
[Java] swea 1953 탈주범검거 (0) | 2021.04.21 |
[Java] swea 2383 점심식사시간 (0) | 2021.04.21 |