[JAVA][白俊16663]13日の金曜日


質問する


載雲はこの地域で有名なオコットファンです.よく図書館で琴の本を読み、外星文化財の研究に参加した載雲は、ある日大きな噂を聞いた.噂の正体は地球の未来に関する予言で、予言によれば2019年から13日金曜日までの数を数えなければ地球は滅亡する可能性がある.普段から思いやりのある載雲は、自分と自分の子孫のために、紀元後10万年から13日までの金曜日の数を毎年記録することにした.しかし、計算が苦手な積載雲はすべての計算を私たちに押しつけた.クラウドで2019年からN年までの累計13日金曜日の数量を計算して教えてあげます.

入力


1行目に整数Nを入力します.(2019 ≤ N ≤ 100,000)

しゅつりょく


1行目出力2019年からN年累計の13日金曜日の数量

✨ Methodology


毎年1回、毎月13日は金曜日です

この問題を解決するため、2019年1月1日の曜日を確認しました.1月1日は火曜日で、曜日配列を作る上で重要な役割を果たしています(自分で探したことがありますが、ヒントには...)

1.閏年


この問題を解決するためには、閏年を知る必要がある.
2月は28日か29日、Nが年度の場合、
  • N%4=0すなわち閏年(29日)
  • N%4=0ですが、N%100=0は閏年(28日)
  • ではありません
  • ビットの条件を満たすが、N%400=0は閏年(29日)
  • 以上の条件をコードで表し、以下のようになります.
    if((N % 4==0 && N % 100!=0)||N % 400==0 )

    2.日数と曜日


    毎月の日数の配列と曜日の配列を格納する必要があります.
    日数の配置
    static int[] days = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    で表す.
  • 0は、1月13日ごとに入手しやすいように加入しています.曜日において詳細に説明されている.
  • 月曜日の並びは火曜日からなので、最初の要素として月曜日に加えます.これも、リンクテキストで説明されていますが、簡単に言えば、1月1日が月曜日であれば、1月8日も月曜日です.つまり、曜日配列[dad%7=1]=は月曜日になるので、この問題では1月1日が火曜日なので、曜日配列[1]は月曜日の0番目の要素でなければならない.
  • という質問で13日が金曜日確認の質問なので、曜日は[前週までの総日数+13日%7]金曜日かどうかを並べておけばいいです.
  • 3. for loop

  • freaky frids変数を設定し、13日が金曜日であれば+を加え、13日が金曜日である回数を計算します.
  • ブルートフォス方式で2019年からN年の間にoutherloopを返却し、その年が閏年か平年かを算出し、閏年であれば日数配列[2月]を29日とし、そうでなければ28日とする.
  • for(int i = 2019; i<=N ; i++) {//년
    	if((i%4==0 && i%100!=0)||i%400==0 ){//윤년일 경우 ->2월에 +1
    	days[2] = 29;}
    	else {days[2]=28;}//윤년이 아닐 경우
    	//inner for loop
    }
  • 外環が当該年度をループバックしたため、内環が生成され、毎月13日が金曜日であるかを確認する.
  • for(int i = 2019; i<=N ; i++) {//년
    	if((i%4==0 && i%100!=0)||i%400==0 ){//윤년일 경우 ->2월에 +1
    	days[2] = 29;}
    	else {days[2]=28;}//윤년이 아닐 경우
    
    	for(int j = 1; j<=12;j++) {//월
    		if(date[(total_days+13)%7]==5) {//13해당 월의 13일이 금요일인가?
    		//System.out.println(i+"년"+j+"월"); //몇년 몇월달의 13일이 금요일인지 확인 가능
    		freaky_fridays++;} //13일이 금요일이면 카운트 ++
    		total_days+=days[j];}//확인이 끝났다면 해당 월의 일수를 총 일수에 더한다		
      }
    総日数プラス13を確認するのは、金曜日以降ですが、その月の残りの日数を加算することは可能ですが、個人的には自分で加算するのではなく、先月までの総日数+13日%7で今月の13日が金曜日であることを確認した方が、その月の総日数を加算する方が簡単だと思いましたので、下記のようにコードします.

    すべてのソース

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    public class BOJ_16463_13일의금요일 {
    static int[] days = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    static int[] date = {1,2,3,4,5,6,7};//월~일 : 1월 1일이 화요일임
    	public static void main(String[] args) throws Exception {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int N = Integer.parseInt(br.readLine());//2019~N년
    		int freaky_fridays = 0;//13일의 금요일
    		int total_days = 0;
    		for(int i = 2019; i<=N ; i++) {//년
    			if((i%4==0 && i%100!=0)||i%400==0 ){//윤년일 경우 ->2월에 +1
    				days[2] = 29;
    			}
    			else {days[2]=28;}//윤년이 아닐 경우
    			//Base Case:
    			for(int j = 1; j<=12;j++) {//월
    				if(date[(total_days+13)%7]==5) {
    				//System.out.println(i+"년"+j+"월");
    				freaky_fridays++;}
    				total_days+=days[j];}
    		}
    		System.out.println(freaky_fridays);
    	}
    
    }