📝문제 설명

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의 범위를 유지한다.

이를 해결하기 위해서는

  1. x+i가 0이 나오는 경우를 방지해야한다. 즉, 7이 나오는걸 방지 -> x+1 -1 을 계산하면 i = 0일 때 x -1이 된다.
  2. 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;
    }
}

💡새로 알게된 점