본문 바로가기
acmicpc/Java

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

by 952_hi 2022. 4. 18.

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


1. 접근방법

 

윤년인지 아닌지에 따라 365일이냐 366일 이냐가 달라지므로 하루가 달라지면 3월부터 생각한 요일이 나오지 않을 것이다. 가장중요한부분 이라고 생각했다. 그래서 따로 함수를 둬서 12월이 지나고 새해가 오면 그해를 체크해주는 함수를 구현해 월별 마지막날을 배열로 관리해줘야겠다고 생각했다.

 

그 후로는 초기 1월1일 화요일 이므로 최초 금요일은 1월 4일로 4일에 7씩 더해서 계속 금요일만 만나서 13일인지 아닌지 체크해 주는 방법을 사용했다. 한달도 괜찮을거같은데 조금 복잡해서 주단위로 해야겠다 생각했다.

 

2.느낀점

크게 어렵지는 않았지만 더 효율적으로 짠다면 수식을 사용하면 될거 같다는 생각이 들었다.

3. 코드

import java.io.*;
public class boj16463 {
	static class Reader {
		int bfs = 1 << 16;
		byte[] buffer = new byte[bfs];
		int bufferPos = 0, bufferState = 0;
		DataInputStream dis = new DataInputStream(System.in);

		byte read() {
			if (bufferPos == bufferState) {
				try {
					bufferState = dis.read(buffer, bufferPos = 0, bfs);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if (bufferState == -1)
					buffer[0] = -1;
			}
			return buffer[bufferPos++];

		}

		int nextInt() {
			int rtn = 0;
			byte c = read();
			while (c <= ' ')
				c = read();
			boolean neg = (c == '-');
			if (neg)
				c = read();
			do
				rtn = rtn * 10 + c - '0';
			while ((c = read()) >= '0' && c <= '9');
			if (neg)
				return -rtn;
			return rtn;
		}
	}
	static int n,month[]= {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	public static void main(String[] args) {
		Reader in = new Reader();
		n = in.nextInt();
		int day = 4;
		int res = 0;
year:	for(int year=2019;year<=n;year++) {
			checkyear(year);

	mon:	for(int i=1;i<=12;i++) {
				while(true) {
					if(day==13) {
						res++;
					}
					day+=7;
					if(day>month[i]) {
						day -= month[i];
						if(i==12) {
							continue year;
						}
						continue mon;
					}
				}
			}
		}
		System.out.println(res);
	}
	private static void checkyear(int year) {
		if(year%400==0) {
			month[2] = 29;
			return;
		}
		if(year%100!=0 && year%4==0) {
			month[2] = 29;
			return;
		}
		month[2] = 28;
	}
}

 

댓글