프로그래밍/백준

[백준/파이썬] 1308번 D-Day

정정훈훈 2024. 3. 31. 00:49
반응형

백준 1308번 D-Day 코드입니다.

정답률이 2024년 3월 31일 기준 22%로 낮은 정답률을 가진 문제입니다.

아래에 풀면서 주의해야 할 것들을 나열해놓을 테니 참고하시기 바랍니다!

 

다른 블로거들이 푼 코드를 읽어보니 Datetime 모듈을 이용한 것 같습니다.

저는 리스트를 활용해서 풀었습니다.

 

 

https://www.acmicpc.net/problem/1308

 

1308번: D-Day

첫째 줄에 오늘의 날짜가 주어지고, 두 번째 줄에 D-Day인 날의 날짜가 주어진다. 날짜는 연도, 월, 일순으로 주어지며, 공백으로 구분한다. 입력 범위는 1년 1월 1일부터 9999년 12월 31일 까지 이다.

www.acmicpc.net

반응형

 

코드

import sys

startDate = list(map(int, sys.stdin.readline().split()))
finishDate = list(map(int, sys.stdin.readline().split()))

if finishDate[0] - startDate[0] > 1000 or (finishDate[0] - startDate[0] == 1000 and startDate[1] <= finishDate[1] and startDate[2] <= finishDate[2]):
    print('gg')
else:
    def leapYear(year):
        if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
            return [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        else:
            return [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    y = startDate[0]
    dayOfMonth = leapYear(y)
    x = dayOfMonth[startDate[1] - 1] - startDate[2]
    x += finishDate[2]

    if startDate[0] == finishDate[0]:
        if startDate[1] == finishDate[1]:
            x = finishDate[2] - startDate[2]
        else:
            if startDate[1] < 2 and finishDate[1] > 2:
                if (startDate[0] % 4 == 0 and startDate[0] % 100 != 0) or startDate[0] % 400 == 0:
                    x += 1
            m = startDate[1]
            while m < finishDate[1] - 1:
                x += dayOfMonth[m]
                m += 1
    else:
        mS = startDate[1]
        while mS < 12:
            x += dayOfMonth[mS]
            mS += 1
        finishDays = leapYear(finishDate[0])
        for m in range(finishDate[1] - 1):
            x += finishDays[m]
        y += 1
        while y < finishDate[0]:
            if (y % 4 == 0 and y % 100 != 0) or y % 400 == 0:
                x += 366
            else:
                x += 365
            y += 1
            
    print('D-%d' % x)
728x90

 

풀이 아이디어

1. gg 조건일 때 ~ gg 조건이 아닐 때로 크게 분기를 나눠줌

2. 연도가 같을 때 - 월이 같을 때 : 시작일자의 해당월의 일수에서 시작일자의 일을 빼줌. 그 값을 종료일자의 일에 더해줌

3. 연도가 같을 때 - 월이 다를 때 : 시작일자와 종료일자의 해당월은 2번처럼 연산. 나머지 중간 달은 윤년 고려하여 각 월의 일수를 더해줌

4. 연도가 다를 때 : 2, 3을 해주고, 윤년 점검 후 365일 또는 366일을 더해줌


*주의사항*

1. 윤년 조건 : 조건문 안에 윤년 조건을 포함하게끔 작성하려고 한다면, and 연산자와 or 연산자 사용에 주의해야 합니다.

2. 윤년 점검 : 코드 내에서 연도가 바뀌거나 연산할 때 윤년 점검을 해줘야 합니다. 시작일자와 종료일자의 연도가 윤년인지 점검을 해줘야 합니다.

3. 문제의 설명문과 [입력] 조건, [출력] 조건을 잘 읽어야 합니다. 코드가 문제 없어보여도 자꾸만 틀린다면, 출력 조건을 확인하세요.gg 출력 조건은 1000년 이상 차이뿐만 아니라, 월, 일도 생각해주어야 합니다.(연도가 2001년 12월 31일과 2101년 1월 1일은 100년 차이가 아닙니다.)

4. 일수 카운팅 : 디데이 계산은 쉽게 말해 종료일에서 시작일을 뺀 값만 나타내어 주면 됩니다. +!을 할 필요도 없습니다.

5. 변수 주의 : 변수가 많이 도입될 수도 있으니 구분에 신경을 써야 합니다.

 

SMALL

 

반응형