2016년 1월 1일은 금요일이었고, 문득 송송이는 특정 날짜의 요일을 맞추고 싶어졌다.
2016년은 윤년이기 때문에 2월 29일이 포함된다. 2016년 m월 d일은 무슨 요일인지 맞추는 프로그램을 작성하시오.
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 두 정수 m,d가 공백으로 구분되어 주어진다.
m,d는 2016년 m월 d일을 정상적으로 나타낼 수 있는 두 정수이다.
각 테스트 케이스마다 2016년 m월 d일이 월요일이면 0, 화요일이면 1, 수요일이면 2, 목요일이면 3, 금요일이면 4, 토요일이면 5, 일요일이면 6을 출력한다.
✨ Methodology
7의 배수 문제
이 문제는 7의 배수의 전형적인 문제로, 2016년으로 한정되어 문제가 출제되었기 때문에 매우 쉽게 풀 수 있는 문제다. GSAT 대표 문제였던 것 같다.
1월 1일로부터 총 며칠이 지났는지 파악한 후 7 로 나누면 쉽게 해결할 수 있다.
각 월마다 총 며칠이 있는지 저장되어있는 배열을 생성하였다. 이때, 나는 배열의 사이즈를 12가 아닌 12+1인 13으로 잡았다.
static int days[] = {0,31,29,31,30,31,30,31,31,30,31,30,31}; //해당 월에 총 며칠이 있는 지 저장
static int date[] = {3,4,5,6,0,1,2};//2016년 1월 1일은 금요일 부터 시작
sum 변수로 입력된 d(일)값을 더한 후, for loop를 통해 위에서 생성한 월별일수를 더한다면 1월 1일을 기준으로 총 며칠이 흘렀는지 계산할 수 있다.
예를 들어, 예제인 12월 31일은 계산기로 직접 계산한다면, 31+29+31+30+31+30+31+31+30+31+30+31일 인 366일이 된다.
이는, 12월이기 때문에 1월부터 11월까지의 모든 일수를 더하고 d값을 더한 수이다.
만약 12월 1일을 구한다면, 1월부터 11월까지의 모든 일수를 더한 후 d값인 1을 더한 값이 총 일수가 된다. 이는 아래와 같이 표현할 수 있다.
int sum = d;
for(int i = 0; i<m; i++) {sum += days[i];}
이렇게 구한 총 일수를 1번의 요일 배열에서 설명한것 처럼 date[총일수%7] 을 구하면 1월 몇요일인지 구할 수 있다.
✨ 전체 소스 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class SWEA_5515_2016년요일맞추기 {
static int days[] = {0,31,29,31,30,31,30,31,31,30,31,30,31}; //해당 월에 총 며칠이 있는 지 저장
static int date[] = {3,4,5,6,0,1,2};//2016년 1월 1일은 금요일 부터 시작
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringTokenizer st ;
for(int t = 1 ; t<=T; t++) {
st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
// 총 m월 d일이 1월 1일을 기준으로 며칠이 흘렀는지 계산한다
int sum = d;
for(int i = 0; i<m; i++) {//0월 부터 m월까지의 일수 (days배열이 m+1사이즈이기 때문에 그 직전 달까지 풀로 보낸 일수가 더해진다)
sum += days[i];
}
//System.out.println(sum);
//int answer = date[sum % 7];//1월 1일은 금요일- > 7의 배수인 성질을 이용했다
System.out.printf("#%d %d\n",t,date[sum%7]);
}
}
}