백준 1308번 D-Day 코드입니다.
정답률이 2024년 3월 31일 기준 22%로 낮은 정답률을 가진 문제입니다.
아래에 풀면서 주의해야 할 것들을 나열해놓을 테니 참고하시기 바랍니다!
다른 블로거들이 푼 코드를 읽어보니 Datetime 모듈을 이용한 것 같습니다.
저는 리스트를 활용해서 풀었습니다.
https://www.acmicpc.net/problem/1308
코드
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)
풀이 아이디어
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. 변수 주의 : 변수가 많이 도입될 수도 있으니 구분에 신경을 써야 합니다.
'프로그래밍 > 백준' 카테고리의 다른 글
[백준/파이썬] 1978 소수 찾기 알고리즘 구현하기 (0) | 2024.03.31 |
---|---|
[백준/파이썬] 1920 수 찾기 : 이진검색트리 말고 세트(집합)으로 풀기, 시간초과 나는 이유 (0) | 2024.03.31 |
[백준/파이썬] 7785번 회사에 있는 사람(딕셔너리, 리스트 활용 문제) (0) | 2024.03.24 |
[백준/파이썬] 1085번 직사각형에서 탈출 (0) | 2024.03.22 |
백준 티어 보는 법, 티어 순서, 문제별 티어 보는 법 (0) | 2024.03.21 |