우당탕탕 파이썬 with 하루하나 알고리즘

백준 2753 파이썬 - if 문에 and, or 연산자 사용하기

hyxndy 2022. 3. 14. 10:05

백준 2753번 - 윤년 with python

Q. 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다. 첫째 줄에 연도가 주어진다.

연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.

 

지난 시간에 if문에 대해 정리를 다 마쳤으므로 if문에 대해 잘 모르겠다면 지난 포스트를 참고하도록 하자.

2022.03.12 - [우당탕탕 파이썬 with 하루하나 알고리즘] - 백준 1330 파이썬 - if문을 통해 두 수 비교하기

 

이번 문제의 핵심은 먼저 문제 상황을 잘 파악하는 것이다. 윤년이라 함은 연도가 4의 배수이면서 100의 배수가 아니거나, 400의 배수일 때이다. 약간 문장의 이중성이 드러나 조금 모호하긴 하지만, 이번 문제에서는 사실 별 문제는 없다.

400의 배수가 곧 4의 배수이기 때문에 4의 배수이면서 400의 배수인 것은 이미 400의 배수라는 조건에 전부 포함되어있기 때문이다.

 

<파이썬 and, or 연산자>

파이썬에서 and와 or연산자를 활용하는 것은 간단하다.

조건과 조건 사이에 and, or를 입력해주면 되는 것이다.

 

조건1 and 조건 2

조건1 or 조건2

처럼 사용이 가능하다.

 

물론 한 문장에 여러 개의 and와 or 연산자를 사용할 수도 있다.

조건1 and 조건2 or 조건3 등으로도 가능하다.

 

and와 or은 논리연산자이다. 논리연산은 True와 False로 값을 반환하게 되는데, '둘 중 하나가 참(True)이면 참(True)이다'. '둘 다 참(True)이면 이 조건문은 참(True)이다.'와 같이 조건문이 참(True)인지 거짓(False)인지 반환해주는 것을 돕는 연산자이다. 결과적으로, and, or의 결과는 True 아니면 False 로 나오게 된다.

 

<참, 거짓>

논리 연산의 결과가 참(True)인지, 또는 거짓(False)인지를 알려주기 위해 논리 연산자의 결과 또한 참(True), 거짓(False)으로 나타내주는데, 이러한 데이터 유형을 Boolean(불린)이라고 한다. 파이썬에서는 Boolean을 Bool 타입으로 저장한다.

T = True, F = False 라는 식을 실행시켰을 때 T와 F는

이와 같은 형식으로 저장된다. 여기서 True와 False를 입력할 때 대소문자에 주의하도록 하자.

 



그럼 이제 각 연산자의 특징을 알아보자.

<and 연산자>

'그리고', '~이면서' 등으로 표현된다.

A and B

조건 A와 조건 B가 모두 참이면 참(True)인 결과를 반환한다. 

즉, 조건 A와 조건 B가 둘 중에 하나라도 거짓이라면 거짓(False)을 반환한다.

이는 교집합을 의미하기도 한다.

조건 A와 조건 B를 둘 다 만족시켜야 결과 값이 참이 나올 수 있다.

 

 

<or 연산자>

'또는', '~이거나' 등으로 표현된다.

A or B

조건 A와 조건 B가 둘 중 하나라도 참이면 참(True)를 반환한다.

즉, 조건 A와 조건 B가 모두 거짓이어야 거짓(False)을 반환한다.

이는 두 조건의 합집합을 의미하기도 한다.

두 조건이 모두 거짓이 나오는 것이 아니라면 결과 값이 참이다.

 

 

<and, or 정리>

and
True and True == True

True and False == False
False and True == False
False and False == False

 

and는 하나만 참이어도 거짓, 둘 다 모두 참이어야만 참

 

or
True or True == True

True or False == True
False or True == True
False or False == False

 

or는 하나만 참이어도 참, 둘 다 모두 거짓이어야만 거짓


그럼 이제 문제로 돌아가보자.

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.

 

연도가 4의 배수이면서 100의 배수가 아닐 때 이므로 

4의 배수 and 100의 배수 아님으로 나타낼 수 있고, 여기에 또는 400의 배수일 때라는 조건을 추가하면 

4의 배수 and 100의 배수 아님 or 400의 배수

로 표현할 수 있다.

여기서 각 배수를 나타낼 수 있는 식으로는 나머지를 활용한 식이 있다.

4의 배수라 함은, 4로 나누어 떨어지므로 나머지가 0이다. 

즉 A라는 값이 있을 때 A가 4의 배수라면 A%4 == 0 이라는 식을 만족한다.

 

이와 같은 방식으로 조건문을 완성해준다면

(A%4 == 0 and A%100 != 0) or A%400 == 0

로 작성할 수 있다.

 

그럼 조건문을 완성하였으니 if문을 작성해보자

이번엔 조건식이 하나다. 즉, 만약 조건1이 아니라면 조건2~~의 형태가 아니기 때문에 elif를 사용해줄 필요가 없다.

if 문 다음에 바로 else문을 사용하면 된다.

먼저 input함수를 통해 값을 받아주고, 그 값을 정수형 인자로 변환시켜주었다.

if 뒤에 조건식을 쓰고, 조건식이 참이라면 1을 출력하라는 코드와,

만약 그렇지 않다면 0을 출력하라는 코드를 작성하였다. 

 

백준 예제와 같이 A에 2000을 넣어보자.

(A%4 == 0 and A%100 != 0) or A%400 == 0 에서

A%4 == 0 and A%100 != 0을 조건(1)

A%400 == 0을 조건 (2)라고 할때

 

2000은 4의 배수이면서 100의 배수이다. 즉, 조건(1)은 만족하지 않아 False이다.

2000은 400의 배수이다. 즉, 조건(2)는 만족하여 True이다.

이 두 조건 사이가 or로 연결되어 있다. 즉, 둘 중 하나만 참이어도 참을 반환한다.

False or True == True 이므로

조건 (A%4 == 0 and A%100 != 0) or A%400 == 0은 참이라는 것을 볼 수 있다.

 

그러므로 2000은 조건식을 만족하게 되어 1을 출력한 것을 볼 수 있다.

 

<코드>

A = int(input())
if ((A%4 == 0 and A%100 != 0) or A%400 == 0):
    print(1)
else:
    print(0)