본문 바로가기
  • Top Genius in the world
알고리듬

[알고리듬] #44 윤년과 평년(2)

by Mr.Algo 2024. 4. 8.
728x90
반응형

파이썬 실습창을 열 수 있습니다.실습창 열기

여유로운 삶을 위하여!

 

 

1. 윤년과 평년

1-3 가운데 부터

윤년과 평년의 판단을 세번 째 방법으로 코딩하여 봅시다.

가운데 부터(100의 배수 부터) 판단할 예정입니다.

아래의 벤 다이어그램울 보면서 이해하세요.

  • 연도가 100의 배수이면
  •             400의 배수이면
  •                        윤년
  •             아니면 (400의 배수가 아니면)
  •                        평년
  • 아니면(100의 배수가 아니면)
  •              4의 배수이면
  •                        윤년
  •              아니면(4의 배수가 아니면)
  •                        평년 

이해를 돕기 위해서 순서도를 그렸습니다.

 

코딩을 완성하여 보세요.

y=2025
if y%100==0:
    if y%400==0:
        r='윤년'
    ??????????????
    ??????????????
else:
    ??????????????
    ??????????????
    else:
        r='평년'
print(r)
더보기
y=2025
if y%100==0:
    if y%400==0:
        r='윤년'
    else:
        r='평년'
else:
    if y%4==0:
        r='윤년'
    else:
        r='평년'
print(r)

'''
다음과 같이 줄바꿈하지 않을 수도 있습니다.
y=2025
if y%100==0:
    if y%400==0: r='윤년'
    else: r='평년'
else:
    if y%4==0: r='윤년'
    else: r='평년'
print(r)
--------------------------------------
조금 더 세련된 방법도 있습니다.

msg=['평년', '윤년']
y=2025
if y%100==0:
    if y%400==0: r=1
    else: r=0
else:
    if y%4==0: r=1
    else: r=0
print(msg[r])

이해가 되십니까?
'''

 

1-4  불(bool)연산으로 

 

위의 벤도를 잘 보세요.

윤년인 경우는 언제입니까?

(4의 배수이고 그리고 100의 배수가 아니거나) 혹은 (400의 배수)인 경우 윤년입니다.

 

아렇게 생각합시다.

일단, 모든 연도는 평년이라 가정합니다.
그런데 (4의 배수이고 그리고 100의 배수가 아니거나) 혹은 (400의 배수)인 경우 윤년으로 바꿉니다.

 

다음과 같이 코딩할 수 있습니다.

msg=['평년','윤년']       # msg는 임의의 변수    
y=2025
r=0                      # 일단, 모든 연도는 평년 
if (y%4==0 and y%100 != 0) or (y%400==0): r=1   # 윤년으로 바꿈, 괄호 생략 가능
print(msg[r])   # r이 0이면 '평년', 1이면 '윤년' 출력

 

더욱 간단히 할 수 있습니다.

msg=['평년','윤년']
y=2025
r=(y%4==0 and y%100 != 0) or (y%400==0)
print(msg[r])

'''
3번 줄에서 bool 식이 참이면 True(1과 같음), 아니면 False(0과 같음)
'''

 

1-5 극도로 간단히

코드 골프(Code Golf) 대회가 있습니다.

'누가 더 적은 타수로 문제를 해결하는가?'를 겨루는 대회입니다.

윤년평년 판단 문제가 코드골프 대회에 출제된다면 다음의 코드로 도전할 수 있을 것입니다.

y=2025
print(['평년','윤년'][y%4==0 and y%100!=0 or y%400==0])

'''
['평년','윤년']은 리스트이고,
[y%4==0 and y%100!=0 or y%400==0]은 인덱싱(indexing)입니다.
인덱싱이 0이면 '평년'을 출력하고, 1이면 '윤년'을 출력하게 됩니다.
인덱싱의 이해를 돕기 위해서 사용하였던 괄호도 제거하였습니다.

평년인 경우는 4의 배수가 아니거나 혹은 100의 배수이고 400의 배수가 아닌 경우입니다.
이 방법으로 코딩한 예입니다.
print(['윤년','평년'][bool(y%4 or y%100==0 and y%400)])

'''

 

우리는 여러가지 방법으로 윤년과 평년을 판단하여 보았습니다.

그러나 공부의 주된 목적은 if 문의 문장 구조를 익히는 것입니다.

몇 번 복습하여 다양한 구조를 익히십시오.

 

수고하셨습니다.

오늘 끝.

728x90
반응형