[백준][1476번] 날짜계산

Updated:

문제 URL

https://www.acmicpc.net/problem/1476 boj1476

나의 풀이

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[3];
        int[] temp = new int[3];
        int[] range = new int[3];

        //초기화
        int dup=0;
        range[0] = 15; range[1] = 28; range[2] = 19;
        for (int i = 0; i < 3; i++) {
            arr[i] = sc.nextInt();
            if(arr[i] == 1) dup++;
            temp[i] = 1;
        }
        if(dup == 3) {
            System.out.println(1);
            return;
        }

        int answer = 1;
        while (true) {
            int cnt = 0;
            for (int i = 0; i < 3; i++) {
                temp[i] += 1;
                if(temp[i] == (range[i] +1)){
                    temp[i] %= range[i];
                }

                if (temp[i] == arr[i]) {
                    cnt++;
                }
            }
            answer++;
            if (cnt == 3) break;
        }
        System.out.println(answer);
    }
}

다른 풀이1

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int E = sc.nextInt();
        int S = sc.nextInt();
        int M = sc.nextInt();
        int e=1,s=1,m=1;
        for (int i=1;; i++) {
            if (e == E && s == S && m == M) {
                System.out.println(i);
                break;
            }
            e += 1;
            s += 1;
            m += 1;
            if (e == 16) {
                e = 1;
            }
            if (s == 29) {
                s = 1;
            }
            if (m == 20) {
                m = 1;
            }
        }
    }
}

다른 풀이2

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int e = sc.nextInt()-1;
        int s = sc.nextInt()-1;
        int m = sc.nextInt()-1;
        for (int i=0;; i++) {
            if (i % 15 == e && i % 28 == s && i % 19 == m) {
                System.out.println(i+1);
                break;
            }
        }
    }
}

다른 풀이3

중국인의 나머지정리를 이용한 방법

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int e = sc.nextInt();
        int s = sc.nextInt();
        int m = sc.nextInt();
        System.out.println((6916*e + 4845*s + 4200*m - 1) % (15*28*19) + 1);
    }
}

느낀점

한 문제에 다양한 풀이 3가지가 나왔는데 모두 중요하게 기억해두자.

  • 브루트포스 준규가 사는 나라는 E S M 이라는 연도를 사용한다. 범위는 1<=E<=15, 1<=S<=28, 1<=M<=19

  • 가능한 경우의 수
  • 15 * 28 * 19 = 7980 으로 굉장히 적다. 따라서 모든 경우를 다해보면 된다.

Leave a comment