본문 바로가기
코딩테스트 준비/백준

[백준] 16463번 - 13일의 금요일 [Java]

by mwzz6 2025. 2. 12.

https://www.acmicpc.net/problem/16463

 

[백준] 16463번 - 13일의 금요일 [Java]
[백준] 16463번 - 13일의 금요일 [Java]


1.  아이디어

 

13일이 금요일이려면 해당 달의 1일이 일요일이어야 한다.


2. 문제풀이

 

윤년과 윤년이 아닌 년의 각 달의 날짜를 저장한 배열을 사용했고 윤년 여부에 따라 사용할 배열을 먼저 선택했다. 현재 요일은 week 변수에 저장했고 2019년 1월 1일이 화요일인데 일요일을 0, 토요일을 6으로 0 ~ 6까지 번호를 부여해서 현재 요일인 화요일(2)로 초기화했다. 이후 각 년의 각 월에 대해 1일이 일요일이면 개수를 세주고 해당 월의 날짜 수만큼 더한 후 7로 나누어주었다. 이렇게 하면 week는 각 년, 각 월의 1일의 요일이 계속 담기게 된다.


3. 코드

 

import java.io.*;

public class Main {

    // 윤년
    private static final int[] monArr = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    // 윤년이 아닌 년
    private static final int[] monArr2 = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    private static final int SUN = 0;
    private static final int TUE = 2;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        int week = TUE;
        int cnt = 0;
        for (int year = 2019; year <= N; year++) {
            int[] arr = (year % 400 == 0) || (year % 100 != 0 && year % 4 == 0) ? monArr : monArr2;

            for (int mon = 1; mon <= 12; mon++) {
                if (week == SUN) cnt++;

                week += arr[mon];
                week %= 7;
            }
        }

        System.out.println(cnt);
    }
}

4. 후기