백준 16463번 :: 13일의 금요일 (Java)

wonjwi🐹·2021년 5월 4일
0

🧑‍💻 Algorithm

목록 보기
7/15
post-thumbnail

문제 설명

백준 16463번: 13일의 금요일 (Silver 3)

재운이는 이 구역의 소문난 오컬트 매니아다. 늘 도서관에서 오컬트 서적을 읽고 외계문물 스터디에 참여하던 재운이는 어느 날 엄청난 소문을 듣게 되었다. 소문의 정체는 지구의 미래에 관한 예언이었는데, 그 예언에 따르면 2019년부터 다가오는 13일의 금요일의 수를 세지 않으면 지구가 멸망할 수 있다고 한다. 평소 배려심이 넘치는 재운이는 자신 뿐만 아니라 자신의 후세들을 위해 앞으로 기원 후 100,000년 까지 누적되는 13일의 금요일의 수를 매 년도마다 기록하기로 했다. 하지만 계산에 약한 재운이는 온갖 계산을 우리에게 떠맡겼다. 재운이를 도와 2019년부터 N년까지 누적되는 13일의 금요일의 수를 계산하여 알려주자.

입력
첫째 줄에 정수 N이 입력된다. (2019 ≤ N ≤ 100,000)

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


문제 풀이

  1. 일주일은 7일이다. 따라서 7일 단위로 같은 요일이 되므로 총 일수를 7로 나눈 나머지를 이용한다.
  2. 13일에서 해당 월의 총 일수를 더하면 다음 달의 13일을 구할 수 있다.
  3. 2번을 반복하면서 2019년부터 N년까지 매월마다 13일이 금요일인지 확인 한다.

소스 코드

소스 코드 링크

public static void main(String[] args) throws NumberFormatException, IOException {
	BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	int N = Integer.parseInt(in.readLine());
	int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	
	// 2019년부터 N년까지 13일의 금요일의 수 (2019년 1월 1일은 화요일)
	int answer = 0, date = 13;
	for (int year = 2019; year <= N; year++) {
		for (int month = 1; month <= 12; month++) {
			// 13일의 금요일인지 확인
			if (date%7 == 4) answer++;
			// 해당월 일수만큼 더하기
			date += days[month];
			// 윤년인 해는 2월이 29일까지 있음
			if (month == 2 && ((year%4 == 0 && year%100 != 0) || year%400 == 0)) date++;
		}
	}
	System.out.println(answer);
}

느낀 점

그리디는 아니지만 어려운 문제가 아니라서 풀이도 코드도 간단하다. 문제에서 2019년 1월 1일이 화요일이라고 주어졌으므로 date%7 == 1이면 화요일이고, 따라서 date%7 == 4이면 금요일이다. 이것만 이용하면 쉽게 풀 수 있는 문제! 물론 윤년을 구하는 방법을 모른다면 좀 헷갈릴 수 있는...? 근데 이 문제에서는 힌트로 윤년 구하는 방법도 다 줬음.

아무튼 시험 대비할 겸 풀었는데 쉬운 거 푸니까 자신감 충전되고 좋다(?) 이런 문제가 코테에 나올 일은 없지만ㅋㅋㅋ 그래도 기본이니까! 알아두면 좋지~ 근데 문제는 시험에 나온 건 멍청하게 금요일 말고 화요일 구해서 틀렸음ㅠ 바보...... 정신 차리자🥲

profile
오늘보다 나은 내일을 위하여 (ง˙∇˙)ว

0개의 댓글