-
[파이썬/Python] 백준 2753번(윤년) 단계별로 풀어보기+ [2월 29일 생일 챙기기]깜빡의 취미/파이썬을 합니다. 2021. 8. 8. 19:45728x90
문제는 다음과 같다.
2753번 기법 설명 (풀이만 보실 분들은 다음 카테고리로 내려가 주시기 바랍니다)
# if절의 기본은 아래의 링크를 참고해 주시면 감사하겠습니다.
문제를 간단히 풀기 위해서, if문의 조건 부분에 추가할 수 있는 표현을 알아두어야 한다. 문제와 관련된 구문 및 각 구문에 해당하는 예시는 아래와 같다.
1) a and (그리고) b -> a와 b 조건이 모두 맞을 때 참(True)으로 인식 2) a or (또는) b -> a와 b 조건 둘 중 하나만 맞아도 참(True)으로 인식 [예시1] >>> a = 90 >>> if a < 0 or a < 100: -> a가 0보다 작거나 100보다 작으면 ... print("1") -> 1을 출력해 주세요! ... else: ... pass ... 1 -> a는 0보다는 크지만, 100보다 작기 때문에 1을 출력. [예시2] >>> a = 90 >>> if a >= 0 and a < 99: -> a가 0보다 크거나 같고 99보다 작으면 ... print("2") -> 2를 출력해 주세요! ... else: ... pass ... 2 -> 두 조건에 모두 맞기 때문에 2를 출력.
문득 든 궁금증. 두 구문을 합쳐서 활용할 수도 있을까? 한 번 확인해 보자.
>>> a = 75 >>> if a < 0 and a > 199 or a == 75: -> a가 0보다 작고 199보다 크거나 a가 75이면 ... print("1") -> 1을 출력해 주세요! ... else: ... pass ... 1 -> 옛다 1
된다. 그럼 이렇게 해도 작동할까?
>>> a = 75 >>> if a < 0 or a > 199 and a == 75: -> a가 0보다 작거나, a가 199보다 크고 a가 75이면 ... print("2") -> 2를 출력해 주세요! ... else: ... print("조건에 안 맞아서 2는 못 주겠다 휴먼.") ... 조건에 안 맞아서 2는 못 주겠다 휴먼.
오류 없이 작동한다. 따라서 조건문만 잘 이해한다면 웬만한 조건은 한 줄에 표현할 수 있다.
2753번 풀이
그렇다면 본격적으로 풀이를 살펴보자. 파이썬에서 X의 배수는 'X로 나눈 나머지가 0인 수'라 달리 부를 수 있다. 이 개념을 이용해 답안 예시 첫 번째를 완성했다.
[답안 예시1] a = int(input()) if a%4==0 and a%100!=0: print('1') elif a%400==0: print('1') else: print('0')
물론 앞서 확인했듯 실은 이렇게 길게 늘여서 식을 쓰지 않아도 된다. 아래와 같이 작성 가능하다.
[답안 예시2] A = int(input()) if A%4 == 0 and A%100 != 0 or A%400 == 0: print("1") else: print("0")
#아래는 저의 개인적인 호기심으로, 2월 29일생의 생일을 찾아주는 간단한 프로그램을 제작 과정을 올려 봅니다.
올해를 기준으로, N년 뒤가 윤년인지 알아보기
별 건 아니지만, 한 가지 아이디어가 추가로 떠올랐다. 올해를 기준으로 몇 년 뒤가 윤년일까? 우선 임의의 수를 집어넣어 윤년인지 아닌지를 파악하는 식부터 시작해 보았다. 완성된 식은 다음과 같다.
import time A = int(input('몇 년 뒤? ')) B = int(time.strftime('%Y')) + A if B % 4 == 0 and B % 100 != 0 or B % 400 == 0: print(f"{B}년, 윤년이네요.") else: print(f"{B}년, 윤년이 아니네요.")
자세한 내용을 이 글에서 다루지는 않겠지만, 주요하게 사용된 기법은 다음과 같다.
1) time 모듈: import time을 통해 실행시킬 수 있다. print(time.strftime(format))을 통해 현재시간 중 원하는 것을 출력할 수 있다. '%Y'는 네 자릿수 연도를 출력해 준다. 이때 출력된 값은 숫자이더라도 문자형(str)으로 취급된다.
2) f 포맷팅: 출력값에 변동할 수 있는 값을 넣을 때 활용한다. 중괄호({}) 안에 넣고 싶은 값을 설정해 두면 된다.
작동 장면을 담아 보았다. 문제없이 돌아간다.
특정 연도 기준으로 가장 가까운 윤년 찾기
좀 더 가보기로 했다. 특정 년도를 입력하면, 프로그램이 자동으로 가장 가까운 윤년을 찾아 준다. while문이 작동하는 동안 1년씩 더하면서, 윤년을 찾으면 while문을 멈추는 방식이다. 입력한 해가 윤년일 경우가 존재할 수 있기 때문에, else문 아래에 1년씩 더하는 메커니즘을 집어넣었다.
A = int(input('몇 년? ')) while 1: if A % 4 == 0 and A % 100 != 0 or A % 400 == 0: print(f"입력한 년도 기준, {A}년이 가장 가까운 윤년입니다.") break else: A = A + 1 continue
실제 작동은 다음과 같다.
올해를 기준으로 가장 가까운 윤년 찾기
위의 두 기법을 합치면 위와 같은 결론을 얻을 수 있다. 식을 먼저 보자.
import time B = int(time.strftime('%Y')) while 1: if B % 4 == 0 and B % 100 != 0 or B % 400 == 0: print(f"올해 기준, {B}년이 가장 가까운 윤년입니다.") break else: B = B + 1 continue
위 두 식의 기법을 합쳐둔 방식이기 때문에, 굳이 확인하지 않겠다. 결과를 잠시 보자.
2024년에 새로 윤년이 돌아온다. 다시 말해, 2월 29일생이신 분들은 2024년에 생일을 맞이할 수 있다.
2월 29일생, 당신의 생일은?
앞의 모든 기법을 종합하면 아래와 같은 식을 짜 볼 수 있다.
import time print("""# 안녕하세요. 이 프로그램은 당신이 남은 생애 동안 볼 수 있는 2월 29일에 대해 다룹니다. # 간단한 세 질문에 답변해 주시면 (공란에 입력해 주세요), 결과를 얻을 수 있습니다. """) A = int(input("몇 년도에 태어나셨나요? [4자리로 입력해 주세요]: ")) B = int(input("몇 살까지 살고 싶으세요? [숫자만 입력해 주세요]: ")) C = int(input("현재 몇 살이신가요? [숫자만 입력해 주세요]: ")) D = A + C -1 생일 = 0 while D-A <= B: if D % 4 == 0 and D % 100 != 0 or D % 400 == 0: 생일 += 1 D += 1 else: D += 1 continue print(f'당신은 남은 생애 동안 {생일}번 2월 29일을 만날 수 있습니다.')
복붙 하여 열어 보면 아래와 같은 결과를 얻을 수 있다.
# 어쩌다 여기까지 왔는지 모르겠습니다. 저의 남은 생애 동안 2월 29일을 몇 번 볼 수 있을지 알 수 있어 좋았습니다. 400년 단위가 아니면 그저 4년에 한 번 있는 윤년이라... 솔직히 이렇게 식을 짤 필요도 없었을 것 같긴 해요ㅎㅎ
+) 재밌으셨으면 공감, 덧글 달아주시면 감사하겠습니다! 실은... 방문만으로도 무척 감사합니다!! 또 들러주세요!
'깜빡의 취미 > 파이썬을 합니다.' 카테고리의 다른 글
[파이썬/Python] 백준 2884번(알람 시계) 단계별로 풀어보기 (0) 2021.08.22 [파이썬/Python] 백준 14681번(사분면 고르기) 단계별로 풀어보기+ [점점 짧아지는 답안 예시 3개] (0) 2021.08.15 [파이썬/Python] 백준 9498번(시험 성적) 단계별로 풀어보기+ [밑으로 갈수록 쉬워지는 답안 3개 모음] (0) 2021.08.01 [파이썬/Python] 백준 1330번(두 수 비교하기) 단계별로 풀어보기 (0) 2021.07.25 [파이썬/Python] 백준 2588번(곱셈) 단계별로 풀어보기 + [문제 완벽 재현! 문제처럼 결과값들 출력하기] (2) 2021.07.18