Navigate back to the homepage

(Algorithm) Day of Programmer

Reno Kim
February 17th, 2020 · 1 min read

Day of the Programmer

Problem HackerRank

  1. Marie 는 타임 머신을 개발했고, 1700년도 부터 2700년도 사이의 한 해중에 Day of the Programmer (그 해의 256번째 날) 러시아를 시간 여행을 함으로써 테스트하고 싶었다.
  2. 1700~1917 은 율리우스력을 사용했고 1919 부터는 그레고리력을 사용했다.
  3. 1918년에는 율리우스력에서 그레고리력으로 바뀌었는데, 1월 31일 다음날은 2월 14일 이었다.
  4. 두 가지 달력 모두 윤달에는 29일이다. 나머지는 28일이고 (2월만)
  5. 율리우스력에서 윤달은 4년마다 있고 그레고리력은 400와 4로 나누어지고 100으로 나누어지지 않는 달이다.
  6. 연도 y가 주어졌을 때 그 해의 Day of the Programmer를 찾아라 단, string foramt = “dd.mm.yyyy” 다

Julian calendar (율리우스력)

  • 4년 마다 2월 29일 추가함

Gregorian calender (그레고리력)

율리우스력은 실질적인 장점에도 불구하고 천문학적 햇수와 날의 계산에서 작은 편차가 있었다. 즉, 율리우스력의 한 해의 길이는 정확히 365일 6시간이며, 이는 천문학적으로 계산한 1년의 길이보다 약 11분 14초가 길다. 이 편차가 제1차 니케아 공의회로부터 1,250여 년 동안 누적된 16세기 후반에 이르러서는 춘분일이 325년 당시보다 열흘이 빨라진 3월 11일 즈음이 되어 달력에 큰 오차가 생겼다. 트리엔트 공의회(1545~1563)에서 교황에게 역법 개정에 대한 권한이 부여되고 이 오차를 줄이기 위하여 1582년 10월 4일 교황 그레고리오 13세가 율리우스력을 개정하였고, 개정한 달력은 그의 이름을 따서 그레고리력으로 부르게 되었다.

  • 1582년 10월 4일(목) 다음날을 1582년 10월 15일(금)로 한다.(위에서 설명한 열흘의 편차를 제거함)
  • 4의 배수인 해를 윤년으로 한다. 그러나 100으로 나눌 수 있지만 400으로 나뉘어 떨어지지 않는 해는 예외로 평년으로 한다.

Solution

1import java.io.*;
2import java.math.*;
3import java.security.*;
4import java.text.*;
5import java.util.*;
6import java.util.concurrent.*;
7import java.util.function.*;
8import java.util.regex.*;
9import java.util.stream.*;
10import static java.util.stream.Collectors.joining;
11import static java.util.stream.Collectors.toList;
12
13public class Solution {
14
15 // Complete the dayOfProgrammer function below.
16 static String dayOfProgrammer(int year) {
17 String result = null;
18 //율리우스력?
19 if(year <= 1917) {
20 // 윤달?
21 if(year % 4 == 0) {
22 // 9월 12
23 result = "12.09.";
24 } else {
25 // 9월 13
26 result = "13.09.";
27 }
28 //그레고리력?
29 } else if (year >= 1919) {
30 //윤달?
31 if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
32 // 9월 12
33 result = "12.09.";
34 } else {
35 // 9월 13
36 result = "13.09.";
37 }
38 //1918?
39 } else {
40 // 9월 26
41 result = "26.09.";
42 }
43
44 return result + year;
45 }
46
47 public static void main(String[] args) throws IOException {
48 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
49 BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
50
51 int year = Integer.parseInt(bufferedReader.readLine().trim());
52
53 String result = dayOfProgrammer(year);
54
55 bufferedWriter.write(result);
56 bufferedWriter.newLine();
57
58 bufferedReader.close();
59 bufferedWriter.close();
60 }
61}

More articles from Reno

Android 번역 관리 툴 추천

Android String 리소스 파일 관리 툴을 추천하는 글입니다.

May 26th, 2019 · 1 min read

suspend 를 붙이면 생기는 일 (feat. 코루틴 동작 원리)

코루틴의 작동 원리에 대해 공부하면서 정리한 글입니다.

February 9th, 2021 · 1 min read
© 2019–2021 Reno
Link to $https://github.com/renovatio0424Link to $https://www.linkedin.com/in/정원-김-33b30415a