목차
[BAEKJOON:1924] 2007년
문제
오늘은 2007년 1월 1일 월요일이다. 그렇다면 2007년 x월 y일은 무슨 요일일까? 이를 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 빈 칸을 사이에 두고 x(1≤x≤12)와 y(1≤y≤31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.
출력
첫째 줄에 x월 y일이 무슨 요일인지에 따라 SUN, MON, TUE, WED, THU, FRI, SAT중 하나를 출력한다.
예제 입력 1 1 예제 출력 MON
해결
-
월의 date의 총 합(day)을 구하고, day를 입력한 일(y)만큼 더해준다.
-
총 일수를 7(일주일은 7일)로 나눈 나머지를 통해 해당 요일을 구한다(0 ,1 ,2 ,3 ,4 ,5 ,6 일~토)
월별 일수를 한 날짜 번호로 합치기
1월 1일을 1번째 날로 두자. x월 y일 앞에 있는 완전한 달들의 길이를 더하고 y를 더하면 그해의 날짜 번호가 된다. 요일은 7일마다 반복하므로 이 번호를 7로 나눈 나머지만 필요하다. 배열이 SUN, MON, ..., SAT 순서여서 나머지 1이 월요일, 0이 일요일에 대응한다.
예를 들어 1월 31일은 31번째 날이므로 31 mod 7=3, 수요일이다. 2월 1일은 31+1=32번째 날이라 나머지 4, 목요일이다. 월 경계에서도 일수를 따로 조정할 필요가 없다. 2007년 2월은 28일이라는 문제 조건을 배열에 이미 반영했다.
코드의 반복문은 i < x인 앞선 달만 더한다. 현재 달을 더하면 한 달만큼 밀린다. 문제는 유효한 2007년 날짜를 준다고 가정하므로 별도 달력 검증은 없다. 한 입력의 계산은 최대 11번 더하기와 나머지 연산 한 번으로 O(12) 시간, 월 길이 배열도 고정 크기다.
| 날짜 | 1월 1일부터 센 날짜 번호 | 7로 나눈 나머지 | 요일 |
|---|---|---|---|
| 1월 1일 | 1 | 1 | MON |
| 1월 7일 | 7 | 0 | SUN |
| 1월 8일 | 8 | 1 | MON |
| 2월 1일 | 32 | 4 | THU |
배열의 첫 원소가 SUN이어서 날짜 번호 0이 아닌 7일째가 일요일에 대응한다. 1월 1일을 0일째로 놓는 구현도 가능하지만, 그때에는 요일 배열의 시작 위치를 함께 바꿔야 한다. 날짜 번호와 배열 인덱스의 기준을 섞지 않는 것이 핵심이다.
코드
import java.util.Scanner;
public class Main {
enum DATE {
SUN, MON, TUE, WED, THU, FRI, SAT;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] date = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int x = scan.nextInt();
int y = scan.nextInt();
int day = 0;
for (int i = 1; i < x; i++) {
day += date[i-1];
}
System.out.println(DATE.values()[(day + y) % 7]);
scan.close();
}
}