백준 16463 - 13일의 금요일

Updated:

Java

16463 번 - 13일의 금요일

문제

  • 2019년부터 N년까지 누적되는 13일의 금요일의 수를 출력한다.

접근 방법

2019년 부터 N 년까지 각 달마다 13일이 금요일인지 확인한다.

각 달이 넘어갈 때 마다 일 수를 해당하는 달만큼 증가시켜 요일을 확인한다.

2019년 1월의 1일은 1이고, 2월의 1일은 32이다.
각 달의 1일에서 12를 더한 값을 7로 Modulo 연산을 하면 해당하는 요일을 구할 수 있다.

매달 마다 현재 달까지의 총 날짜 수의 합을 구한 뒤, 그 달의 13일이 금요일인지 확인한다.

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n, result;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk;
    	n = stoi(br.readLine());
    	int count = 0;
    	int day = 1;	// 화요일
    	int[] month = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    	for(int year = 2019; year <= n; year++) {
    		for(int j = 1; j <= 12; j++) {
    			if((day + 12) % 7 == 4) {	// 13일이 금요일인지 확인
    				count++;
    			}
    			if(j == 2) {
    				if(year % 400 == 0) 	// 400의 배수 연도는 윤년이다.
						day += 29;
					else if(year % 400 != 0 && year % 100 == 0)	// 400의 배수가 아니면서 100의 배수인 연도는 윤년이 아니다.
						day += 28;
					else if(year % 100 != 0 && year % 4 == 0)	// 100의 배수가 아니면서 4의 배수인 연도는 윤년이다.
						day += 29;
					else	// 그 외의 연도는 윤년이 아니다.
						day += 28;
    			}
    			else
    				day += month[j];
    		}
    	}
    	System.out.println(count);
    	br.close();
	}
	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

개선할 점

없습니다.