Notice
Recent Posts
Recent Comments
Link
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- putty
- DBeaver
- jenkins
- javascript
- 백준
- PostgreSQL
- 1773번
- 환경번수
- boj
- rocky linux
- Rocky Linux 9
- 제수가 0입니다
- 백준 JAVA
- 자바
- available plugins
- 사용법
- ora-01476
- bekjoon
- jsonb select
- 서버 접근
- SVN
- jaekjoon java
- poll scm
- 백준 java jaekjoon JAVA
- 메뉴얼
- linux
- subversion
- java
- baekjoon
- tomcat-users.xml
Archives
기록하는 개발자
[백준 1308번] D-Day - JAVA 알고리즘 본문
1308번 |
문제 | |
캠프에 오게 된 송유진은 캠프가 너무 지루해서 오늘로부터 캠프가 끝날 때 까지 며칠이나 남았는지 알아보고 싶었다. 그런데 캠프는 비상식적으로 길지도 몰라서 (윤년을 포함할지도 모른다) 손으로 하나하나 세기에는 힘들어 보였다. 더욱 정확한 계산을 위해, 유진이는 윤년이 정해지는 기준을 찾아보았고, 그것은 다음과 같았다.
|
|
입력 | |
첫째 줄에 오늘의 날짜가 주어지고, 두 번째 줄에 D-Day인 날의 날짜가 주어진다. 날짜는 연도, 월, 일순으로 주어지며, 공백으로 구분한다. 입력 범위는 1년 1월 1일부터 9999년 12월 31일 까지 이다. 오늘의 날짜는 항상 D-Day보다 앞에 있다. | |
출력 | |
오늘부터 D-Day까지 x일이 남았다면, "D-"를 출력하고 그 뒤에 공백 없이 x를 출력한다. 만약 캠프가 천년 이상 지속된다면 (오늘이 y년 m월 d일이고, D-Day가 y+1000년 m월 d일과 같거나 늦다면) 대신 "gg"를 출력한다. 오늘이 2월 29일인 경우는 주어지지 않는다. | |
예제 입력 | 예제 출력 |
2008 12 27 2009 1 22 |
D-26 |
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.ParseException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException, ParseException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
/** */
int monthTotal[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int D_Day = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
StringTokenizer st2 = new StringTokenizer(br.readLine());
int nowYear = Integer.parseInt(st.nextToken());
int nowMonth = Integer.parseInt(st.nextToken());
int nowDay = Integer.parseInt(st.nextToken());
int endYear = Integer.parseInt(st2.nextToken());
int endMonth = Integer.parseInt(st2.nextToken());
int endDay = Integer.parseInt(st2.nextToken());
/**1000년 초과시 gg*/
if(nowYear+1000<endYear
||(nowYear+1000==endYear&&nowMonth<endMonth)
||(nowYear+1000==endYear&&nowMonth==endMonth&&nowDay<=endDay)) {
bw.write("gg");
}else {
/**년도 계산(시작년도,종료년도 포함x)*/
for(int year = nowYear+1; year<endYear; year++) {
if(((year%4==0 && year%100!=0)||year%400==0)) { //윤년 체크
D_Day = D_Day + 366;
} else{
D_Day = D_Day + 365;
}
}
/**시작년도,종료년도 계산*/
if(nowYear == endYear) {//시작,종료 년도가 같을때
if(nowMonth==endMonth) {//시작, 종료 월이 같은경우
D_Day = D_Day + (endDay-nowDay);
}else { //이외(시작월이 더 빠를때)
for(int month = nowMonth+1; month<endMonth; month++) {
D_Day = D_Day + monthTotal[month];
}
if(((nowYear%4==0 && nowYear%100!=0) || nowYear%400==0)
&& nowMonth<=2 && 3<=endMonth){
D_Day = D_Day +1;
}
//시작월
D_Day = D_Day + monthTotal[nowMonth-1]-nowDay;
//종료월
D_Day = D_Day + endDay;
}
}else {//시작,종료 년도가 다를때
for(int month = 0; month<endMonth-1; month++) {
D_Day = D_Day + monthTotal[month];
}
for(int month = nowMonth; month<12; month++) {
D_Day = D_Day + monthTotal[month];
}
//시작년도가 윤년이도 시작월이 2월 이전
if(((nowYear%4==0 && nowYear%100!=0) || nowYear%400==0) && nowMonth<=2){
D_Day = D_Day +1;
}
//종료년도가 윤년이고 종료월이 3월 이후
if(((endYear%4==0 && endYear%100!=0) || endYear%400==0) && 3<=endMonth){
D_Day = D_Day +1;
}
//시작월
D_Day = D_Day + monthTotal[nowMonth-1]-nowDay;
//종료월
D_Day = D_Day + endDay;
}
bw.write("D-"+D_Day);
}
bw.close();
br.close();
}
}
개인적으로 정리한 내용을 간단하게 풀어 작성했습니다. 이해가 안가는 부분은 댓글 남겨주시면 설명해드리겠습니다. |
'Baekjoon Online Judge' 카테고리의 다른 글
[백준 2920번] 음계- JAVA 알고리즘 (0) | 2022.06.08 |
---|---|
[백준 2675번] 문자열반복 - JAVA 알고리즘 (0) | 2022.06.08 |
[백준 14928번] 큰 수 - JAVA 알고리즘 (3) | 2022.05.02 |
[백준 1264번] 모음의 개수- JAVA 알고리즘 (0) | 2022.04.26 |
[백준 3062번] 수 뒤집기 - JAVA 알고리즘 (0) | 2022.04.26 |
Comments