코드굽는 타자기

SWEA[1952] - 수영장 본문

알고리즘/완전탐색

SWEA[1952] - 수영장

bright-jun 2020. 2. 18. 14:57

링크

SWEA[1952]

문제설명

  • 완전탐색

문제풀이

  • 완전탐색

문제코드

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Solution1952 {

    public static int Ans=Integer.MAX_VALUE;    // 1년 이용권
    public static int Temp = 0;
    public static int[] month_day = new int[13]; //    (N%12+1) (1~12)
    public static int[] price = new int[4];

    public static void Search(int month) {
        if(month>=13) {
            Ans = Math.min(Ans, Temp);
            return;
        }
        if(month_day[month]==0) {
            Search(month+1);
        }
        else {
            for (int i = 0; i < 3; i++) {
//                1일권, 1달권, 3달권 선택 시
                switch (i) {
//                1일권 - 그 날 모든 날 다 사용한다. 1일권, 1달권 섞으면 무조건 손해
                case 0:
                    Temp+=price[i]*month_day[month];
                    Search(month+1);
                    Temp-=price[i]*month_day[month];
                    break;
//                1달권
                case 1:
                    Temp+=price[i];
                    Search(month+1);
                    Temp-=price[i];
                    break;
//                3달권
                case 2:
                    Temp+=price[i];
                    Search(month+3);
                    Temp-=price[i];
                    break;
                }
            }
        }
    }
    public static void main(String args[]) throws Exception
    {
        System.setIn(new FileInputStream("res/swea/1952.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int T;
        T=Integer.parseInt(br.readLine());
        for(int test_case = 1; test_case <= T; test_case++)
        {
//            입력
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < 4; i++) {
                price[i] = Integer.parseInt(st.nextToken());
            }
            st = new StringTokenizer(br.readLine());
            for (int i = 1; i <= 12; i++) {
                month_day[i] = Integer.parseInt(st.nextToken());
            }
            Ans = price[3];    //1년 이용권
            Search(1);

            System.out.println("#"+test_case+" "+Ans);
//            초기화
            Ans=Integer.MAX_VALUE;
        }//test_case end
    }//main end
}

아쉬운점

  • 문제 이해를 제대로 못했음
    • (12,1,2), (11,12,1) 이 아니라 그냥 12, 11에 사용 가능한 것일 뿐임
    • 2020년 11월,12월 이지 2020년 11월,12월,1월은 말이안됨.

잘한점

  • DFS
  • 1일치랑 1달치 1달에 섞이면 무조건 손해임
    • 1일치 쓰려면 무조건 1달치 전부 다 써야 함.
  • 3달치 사용하면 Search(month+3) 함

'알고리즘 > 완전탐색' 카테고리의 다른 글

SWEA[1247] - 최적 경로  (0) 2020.02.18
SWEA[2806] - N-Queen[D3]  (0) 2020.02.18
SWEA[2383] - 점심 식사시간  (0) 2020.02.18
Programmers[42840] - 모의고사[Level1]  (0) 2020.02.17
SWEA[1244] - 최대 상금[D3]  (0) 2020.02.09
Comments