본문 바로가기
Algorithm/Problem_SW

모의 SW 역량테스트(수영장)

by uyoo 2020. 4. 16.

[수영장]

 

* 로직

  • 재귀를 사용해 DFS를 돌려 모든 경우의 수를 고려하면 된다.

  • 우선 1월~12월까지 모두 수영장을 이용하는 일수가 존재하지 않다면 -> answer = 0으로 리턴한다
  • 만약 존재하는 상황이라면
    • 우선적으로 1년 이용권을 사용한 경우로 answer를 갱신한 뒤 재귀함수를 진행한다 

    • 현재 index의 값(Month[])이 0이라면 -> 값 갱신 없이 다음 index를 호출한다
    • 1 이상이라면 -> 3가지 경우를 호출한다
      • 1일 이용권 사용하는 경우
      • 1달 이용권 사용하는 경우
      • 3달 이용권 사용하는 경우
  • 위 과정을 반복하며 최솟값을 갱신한다

 

// 수영장
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]);
		}								
	}

}