https://www.acmicpc.net/problem/1308
진짜 나를 힘들게 하는 문제였다..
3시간 정도 고민하다 안돼서 그냥 풀이를 봤다
아 불행해..................................
밑에는 틀린 코드다.
20%에서 틀렸습니다가 뜬다.
dday 계산기로 비교하니 간간이 틀린 답이 나오곤 한다.
package problem_solved;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class n1308 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int year = Integer.parseInt(st.nextToken());
int month = Integer.parseInt(st.nextToken());
int day = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int f_year = Integer.parseInt(st.nextToken());
int f_month = Integer.parseInt(st.nextToken());
int f_day = Integer.parseInt(st.nextToken());
boolean leap = false;
int dday = 0;
// gg 체크
if (is_gg(year, month, day, f_year, f_month, f_day)) {
bw.write("gg");
} else {
if (f_year - year > 0) { // 1년 이상 차이 날 경우
if (f_month >= month && f_day >= day) { // 365일 이상 차이 날 경우
for (int i = 0; i < (f_year - year); i++) {
if (check_leap(year + i) == true) {
dday += 366;
} else {
dday += 365;
}
}
year = f_year;
} else { // 365일 미만으로 차이 날 경우
for (int i = 0; i < (f_year - year - 1); i++) {
if (check_leap(year + i) == true) {
dday += 366;
} else {
dday += 365;
}
}
year = f_year - 1;
}
}
if (month != f_month) {
if(month>f_month) {
dday += count_day(month, year) - day;
day = 0;
while (month != 12) {
dday += count_day(month, year);
++month;
}
year++;
month = 1;
}
while (month != f_month) {
dday += count_day(month, year);
++month;
}
}
if(month == f_month) {
dday += f_day - day;
}
bw.write("D-" + dday);
}
bw.flush();
bw.close();
br.close();
}
// gg체크
public static boolean is_gg(int year, int month, int day, int f_year, int f_month, int f_day) {
if (f_year - year > 1000) {
return true;
} else if (f_year - year == 1000) {
if (f_month > month) {
return true;
} else if (f_month == month) {
if (f_day >= day) {
return true;
}
}
}
return false;
}
// 달 별 날 수 세기
public static int count_day(int month, int year) {
int[] day = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if (month == 2) {
if (check_leap(year)) {
return 29;
}
}
return day[month];
}
// 윤년 체크
public static boolean check_leap(int year) {
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0) {
return true;
} else {
return false;
}
}
return true;
}
return false;
}
}
다른 사람 풀이를 보니 모든 일수를 구해서 빼는 아주 간단한 방법을 쓰고 있었다...
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int year = Integer.parseInt(st.nextToken());
int month = Integer.parseInt(st.nextToken());
int day = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int f_year = Integer.parseInt(st.nextToken());
int f_month = Integer.parseInt(st.nextToken());
int f_day = Integer.parseInt(st.nextToken());
boolean leap = false;
int dday = 0;
// gg 체크
if (is_gg(year, month, day, f_year, f_month, f_day)) {
bw.write("gg");
} else {
dday= check_days(f_year,f_month-1,f_day) - check_days(year,month-1,day);
bw.write("D-" + dday);
}
bw.flush();
bw.close();
br.close();
}
public static int check_days(int year,int month,int day) {
int[] m_day = {31,28,31,30,31,30,31,31,30,31,30,31};
int days = 0;
for(int i=0;i<year; i++) {
days+=365;
if(check_leap(i)==true) {
days+=1;
}
}
for(int i=0;i<month; i++) {
days+=m_day[i];
if(i==1&&check_leap(year)==true) {
days+=1;
}
}
days+=day;
return days;
}
// gg체크
public static boolean is_gg(int year, int month, int day, int f_year, int f_month, int f_day) {
if (f_year - year > 1000) {
return true;
} else if (f_year - year == 1000) {
if (f_month > month) {
return true;
} else if (f_month == month) {
if (f_day >= day) {
return true;
}
}
}
return false;
}
// 윤년 체크
public static boolean check_leap(int year) {
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0) {
return true;
} else {
return false;
}
}
return true;
}
return false;
}
}
위에 내 코드에 무슨 문제가 있는지 알아보고 싶은데 알아보기 싫다.........
실버 5고 간단 날짜 계산 문제라 얕봤는데 너무 고통스러운 시간이였다.