본문 바로가기
🥇Problem Solving (psS2mj)/SWEA

[SWEA] 5515. 2016년 요일 맞추기 (Java)

by psS2mj 2020. 4. 7.
반응형

문제 링크 / level: D3

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWWOwecaFrIDFAV4&categoryId=AWWOwecaFrIDFAV4&categoryType=CODE

 

 

 

내가 생각한 풀이

수학과 논리에 대해서 공부하던 중 추천문제에 있어서 풀게되었다.

요일을 구할 때에는 %7를 이용해서 나머지인 0~6을 활용하면 월요일부터 일요일까지 깔끔하게 구할 수 있다는 것이 포인트.

 

문제의 핵심 (출처: SWEA)

문제에서 주어지는 입력값(날짜)의 요일을 구하기 위해서는 크게 두 가지 조건이 필요하다.

1. 기준이 되는 날짜와 그 날짜의 요일

2. 기준일로부터 입력된 날짜까지의 경과일

 

이렇게 두 가지만 있으면 어떤 날짜가 주어지든 쉽게 요일을 구할 수 있다.

 

이제부터 알아보자~

 

내 코드의 논리는 이러하다.

1. 문제에서 주어진 기준일은 2016년 1월 1일 금요일이다. 얘를 기준으로 잡아준다. 어차피 2016년 내의 날짜를 구하는 것임.

2. 경과일을 계산할 때 1월은 일수만 따져주면 되고, 1월이 아닐 경우에는 입력된 달과 1월 사이의 차이만큼 미리 선언해둔 days배열(1월부터 12월까지 각 달의 일수를 저장해둔 배열)을 활용해서 경과일을 계산해준다.

3. 2번에서 구한 값을 토대로 요일을 계산해준다. 이때, 기준일의 요일이 금요일이므로 금요일을 기준으로 계산해준다.

 

// 핵심 코드

// 경과일 계산
if(m==1) {diff=d-1;}
else {
	for (int i = 2; i < m; i++) {
		diff += days[i];
	}
	diff = diff + 30 + d ; 
}
// 요일 계산
int temp = diff%7;
if(temp<=2) {
	Ans += temp;
} else {
	Ans = Ans + temp - 7;
}

 

위 코드에서 '경과일 계산'이라는 주석을 달아놓은 코드가 2번에 해당하고, '요일 계산'이라는 주석을 달아놓은 코드가 3번에 해당한다. 아참, 참고로 days 배열은 이렇게 생겼다.

static int[] days = {0,31,29,31,30,31,30,31,31,30,31,30,31};

인덱스를 그대로 월로 사용하기 위해서 0번 인덱스는 0으로 그냥 비워뒀고,

1월은 31일까지, 2월은 29일까지(※문제에 주어진 조건임), 3월, 4월... 12월까지 다 채워놓고 이를 활용했다.

예전에 SWEA에서 D1였나 D2문제 풀 때 배웠던 기법인데 요긴하게 썼다. 역시 나도 점점 늘고있다구~~~😎✌

 

// 경과일 계산 (diff: 경과일)

1. 만약 input이 1월달이라면 입력받은 d(일)-1 연산을 해서 diff를 구해준다. (주어진 기준일이 1월 1일)

2. 만약 input이 1월이 아니라면 (2월~12월) 2월부터 입력받은 m(월)의 직전 달까지 days 배열에 저장된 일수만큼 diff에 더해준다. ※참고로, m(월)은 포함시키면 안됨. 얘는 후에 따로 계산한다.

  2-1. 만약 input의 m(월)이 2월이라면 for문을 지나쳐서 그 아래에 있는 코드를 실행한다.

3. for문을 다 실행한 후에는, for문에서 구한 diff 값에 input의 d(일)수를 더해주고 마지막으로 1월 1일부터 31일까지의 경과일에 해당하는 30일을 추가로 더해준다. 즉, diff = diff + 30 + d라는 코드의 의미는 1월과 m월 사이에 끼어있는 모든 일수를 다 더해준 후1월 1일부터 31일까지에 해당하는 30일m월에서 d일이 흐른만큼 경과일에 추가해준다는 의미다. (응.. 나만 알아들으면 됐지^_^)

 

// 요일 계산 (temp: %7 연산 결과를 잠시 저장하기 위함, Ans: 정답)

1. 기준일의 요일이 금요일(4)이므로 요일을 계산할 때도 이를 기준으로 삼는다. 쉽게 말해서 시작을 4로 둔다는 얘기.

2. 경과일에 %7 연산을 해준다. 요일을 구하기 위해서다. 이 값을 temp에 저장한다.

  - 만약에 결과값이 0이면 기준일과 같이 금요일(4)일테고, 1이면 금요일에서 하루 지난 토요일(5)일테고, 2이면 금요일에서 이틀 지난 일요일(6)일테고.. 이런 식이다.

3. 따라서 temp 값이 0, 1, 2일 때는 그냥 처리해준다. 하지만 3 이상일 때는 7로 넘어가면 안되고 다시 0으로 돌아와야하므로 Ans에 temp 값을 더한 뒤에 7을 빼준다. (예를 들면, temp가 3일 때 Ans+temp=7이므로 7을 빼주면 월요일(0)로 처리할 수 있다. 1번에서 말했다시피 시작을 4로 뒀기 때문에 Ans의 초기값은 4이다.)

 

이렇게 해서 요일이 깔끔하게 계산되었다. 참 쉽쥬?😁👍

 

 

▼아래 더보기를 누르면 코드 전체를 볼 수 있습니다.

더보기

[코드 보기]

 

 

 

쫑알쫑알하긴 했지만 기준만 잘 잡고 있으면 비교적 간단하게 풀어낼 수 있는 문제였다.

그래도 days 배열을 활용하는 것과 논리를 생각해보는 것에서 공부할 점이 있었다.

 

 

- 쫑알쫑알 문제풀이🐥, 끝 -

p.s. 그나저나 맞춤법 지킴이로서 '요일 맞추기'라는 표현이 불편하네요... '요일 맞히기'가 맞습니다... 문제를 맞히다. 이게 맞다구요!!😠😡

반응형

댓글