📝문제 설명
2025년 1월 1일이 무슨 요일이 주어졌을 때, 이번년도 주말은 며칠 쉴 수 있는지 계산해보자.
X는 1월 1일이 무슨 요일인지 의미한다.
1은 월요일, 2는 화요일... 7은 일요일
📢입출력 예시
입력 : 7
출력 : 105
✏️문제 풀이
1. 기본 개념 : 요일의 주기성
요일은 7일 주기로 반복되므로, 특정 날짜의 요일을 구할 때는 7로 나눈 나머지를 이용한다.
- 1월 1일 : x요일(1~7)이라면,
- 1월 2일 : x+1요일
- 1월 3일 : x+2요일
- 1월 4일 : x+3요일
- 1월 5일 : x+4요일
- 1월 6일 : x+5요일
- 1월 7일 : x+6요일
- 1월 8일 : x+7요일, 즉 다시 x요일이된다.
이런 식으로 요일이 (x, x+1, x+2, x+3, ..., x+6) 형태로 순환한다.
2. i일 후의 요일을 일반화하기
어떤 날짜 i일 후의 요일을 current라고 하면
- current = (x+i) mod 7
그러나 요일은 1부터 7까지 표현 되므로, 1을 기준으로 조정해야 한다.
3. 공식 유도
기본적으로 i=0 일 때 current = x가 되어야한다.
그러나 (x+i)%7을 쓰면 x = 1 일때는 1~7의 범위를 유지하지만
x = 7일 때는 0~6의 범위를 유지한다.
이를 해결하기 위해서는
- x+i가 0이 나오는 경우를 방지해야한다. 즉, 7이 나오는걸 방지 -> x+1 -1 을 계산하면 i = 0일 때 x -1이 된다.
- 7로 나눈 나머지에 다시 1을 더해 요일 범위를 1~7로 맞춘다.
결과적으로
- current = (x + i - 1) mod 7 + 1
이란 공식이 나오게 된다.
package Baekjoon.Simulation;
public class 주말개수구하기 {
public static void main(String[] args) {
int x = 7;
System.out.println(solution(x));
}
private static int solution(int x){
int count = 0;
for(int i=0; i<365; i++){
int currentDay = (x + i - 1) % 7 + 1;
if(currentDay==6 || currentDay==7){
count++;
}
}
return count;
}
}
💡새로 알게된 점