[수영장]
* 로직
- 재귀를 사용해 DFS를 돌려 모든 경우의 수를 고려하면 된다.
- 우선 1월~12월까지 모두 수영장을 이용하는 일수가 존재하지 않다면 -> answer = 0으로 리턴한다
- 만약 존재하는 상황이라면
- 우선적으로 1년 이용권을 사용한 경우로 answer를 갱신한 뒤 재귀함수를 진행한다
- 현재 index의 값(Month[])이 0이라면 -> 값 갱신 없이 다음 index를 호출한다
- 1 이상이라면 -> 3가지 경우를 호출한다
- 1일 이용권 사용하는 경우
- 1달 이용권 사용하는 경우
- 3달 이용권 사용하는 경우
- 우선적으로 1년 이용권을 사용한 경우로 answer를 갱신한 뒤 재귀함수를 진행한다
- 위 과정을 반복하며 최솟값을 갱신한다
// 수영장
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Problem_1952 {
static int M;
static int[] Fares; //1일, 1달, 3개월, 1년
static int[] Month;
static int answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int testCase = Integer.parseInt(br.readLine());
int t=1;
while(t<=testCase) {
M = 12;
Month = new int[M];
Fares = new int[4];
// input fare
String input = br.readLine();
st = new StringTokenizer(input, " ");
int size = st.countTokens();
for(int i=0; i<size; ++i) {
Fares[i] = Integer.parseInt(st.nextToken());
}
// input month & 1년 사용했을 때의 금액 구하기
boolean check = false;
input = br.readLine();
st = new StringTokenizer(input, " ");
for(int i=0; i<M; ++i) {
Month[i] = Integer.parseInt(st.nextToken());
if(Month[i] > 0) check = true;
}
//수영장 사용일이 모두 0일이라면
if(!check) {
answer = 0;
}
else {
answer = Integer.MAX_VALUE;
answer = Math.min(answer, Fares[3]); //1년 사용량과 먼저 비교
doSolution();
}
System.out.println("#" + t + " " + answer);
t++;
}
}
private static void doSolution() {
//1일, 1달, 3달
int index=0;
int acc=0;
doProcess(index, acc);
}
private static void doProcess(int index, int acc) {
if(index >= M) {
answer = Math.min(answer, acc);
return;
}
if(Month[index] <= 0) {
doProcess(index+1, acc);
}
else {
//1일 사용권
doProcess(index+1, acc+(Month[index] * Fares[0]));
//1달 사용권
doProcess(index+1, acc+Fares[1]);
//3달 사용권
doProcess(index+3, acc+Fares[2]);
}
}
}
'Algorithm > Problem_SW' 카테고리의 다른 글
SW 역량 테스트 기출 문제(새로운 게임 2) (0) | 2020.04.23 |
---|---|
SW 역량 테스트 A형 기출 문제 (다리 만들기 2) (0) | 2020.04.22 |
모의 SW 역량테스트(점심 식사 시간) (0) | 2020.04.10 |
모의 SW 역량테스트(요리사) (0) | 2020.03.26 |
모의 SW 역량테스트(벽돌깨기) (0) | 2020.03.20 |