카테고리 없음

[백준/파이썬][Bronze I] 세로 달력 - 26148

난쟁이 개발자 2025. 3. 6. 08:34
반응형

[Bronze I] 세로 달력 - 26148

문제 링크

성능 요약

메모리: 108384 KB, 시간: 96 ms

분류

애드 혹, 수학

제출 일자

2025년 3월 6일 08:25:32

문제 설명

달력을 유심히 바라보던 성현이는 달력의 어떤 열은 5칸으로 이루어져 있다는 사실을 발견했다.

성현이는 5칸으로 이루어져 있는 달력의 열을 "세로 달력"이라고 부르기로 했다.

성현이는 N년 달력에는 총 몇 개의 "세로 달력"이 있는 지 궁금해한다.

성현이를 위해 N년 달력의 "세로 달력" 수를 구해주자!

입력

첫 번째 줄에 N이 주어진다. (1 900≤N≤109)

두 번째 줄에 N년 달력 1월 1일의 요일이 주어진다.

요일은 1에서 7까지의 숫자로 주어지며, 각 숫자는 순서대로 [일,월,화,수,목,금,토]를 의미한다. (단, 입력은 현실의 달력과 다를 수 있다.)

출력

 N년 달력의 '세로 달력' 수를 구해 출력한다.

풀이

cale = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def sol_26148() :
    # 윤년의 조건
    # 4의 배수, not 100의 배수
    # 400의 배수
    N = int(input())
    days = int(input()) # 요일
    ans = 0

    if (N % 4 == 0 and N % 100 != 0) or (N % 400 == 0) :
        ans += 1

    ans += sum(cale) - 28 * 12

    print(ans)


sol_26148()

생각해보니 아래로 풀면 되는구나. 굳이 달력의 마지막 날짜를 계산할 필요가 없었다.

def sol_26148() :
    # 윤년의 조건
    # 4의 배수, not 100의 배수
    # 400의 배수
    N = int(input())
    days = int(input()) # 요일
    ans = 0

    if (N % 4 == 0 and N % 100 != 0) or (N % 400 == 0) :
        ans += 1

    ans += 365 - 28 * 12

    print(ans)

sol_26148()

그래도 달력을 한 번 쫙 보고 나니까 계산이 간편해졌다. 혹시나 잘 모르겠다고 하시는 분들은 달력을 한 번 보시고 문제를 해결해볼 것을 추천한다. 의외로 단순하다.

5줄이 생성되는 원인은 $7 \times 4 = 28$ 을 생각해보면 28을 초과하는 29부터는 5줄이 형성된다는 것을 생각해볼 수 있다. 그러면 $365 - 28*12$ 를 하게 되면 세로 달력을 확인할 수 있다.

여기서 주의할 점은 윤년이다. 윤년의 윤은 돌아오는 이라는 뜻으로, 2월 29일이 속하는 년이라고 생각하면 된다. 윤년의 조건은 4의 배수이면서 100의 배수가 아닌 해, 또는 400의 배수 일 때 윤년이라고 한다. 그러면 조건문을 작성할 수 있다. 나머지는 코드를 확인해보면 확인이 가능하다.

사실 days는 큰 상관이 없는 진짜 단순한 수학 문제 풀이이다. 

반응형