[JAVA][SWEA 5515] 2016년 요일 맞추기

June Park·2021년 10월 4일
0
post-thumbnail

문제

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 로 나누면 쉽게 해결할 수 있다.

1. 월별 일수 배열과 요일 배열 생성

각 월마다 총 며칠이 있는지 저장되어있는 배열을 생성하였다. 이때, 나는 배열의 사이즈를 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일은 금요일 부터 시작
  • 일수 배열

    만약, 일수 배열의 사이즈가 12인 {31,29,31,30,31,...,31}로 잡는다면 1월이 입력으로 주어졌을 때 따로 if 조건을 주어서 1월일 경우는 계산하지 않거나 for loop 조건을 수정해야 한다.
    하지만 dummy data 로 0월 0일을 days 배열에 삽입하게 된다면, for loop를 0부터 돌려서 1월일 때에는 days[0] = 0일, 2월일 때에는 days[0]+days[1] = 31로 쉽게 해당 달의 며칠인지만 더해주면 1월 1일로부터 총 며칠이 지났는지 알 수 있다.
  • 요일 배열

    요일 배열은 각 요일이 7을 주기로 되돌아 오는 성질을 사용하기 위해 만들어 주었다. 만약 1월 1일이 월요일이라면 1+7일인 8일도 월요일이 된다. 즉, 1%7 = 1 이 월요일이기 때문에, 8%7= 1역시 월요일이 된다.
    문제에서, 2016년 1월 1일은 금요일이라고 문제에서 주어졌다. 따라서 요일 배열을 {목,금,토,일,월,화,수}요일 순으로 지정한다면,
    1일일 경우: date[1%7] = date[1] = 금요일이 된다.

2. sum

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]);
		}
	}

}

0개의 댓글