윤년

year = int(input())

leap = (year % 4 == 0 and year % 100 != 0) or year % 400 == 0

print(int(leap))

논리연산자

Python에는 and, or, not 논리연산자가 있습니다. 논리값으로 평가될 수 있는 두 값 ab가 있을 때, 논리연산은 다음과 같습니다. (정확한 의미는 아직 이해하지 않아도 됩니다.)

연산 의미 정확한 의미
a and b ab가 모두 참인가? a가 거짓이면 a, 참이면 b.
a or b ab 중 적어도 하나가 참인가? a가 참이면 a, 거짓이면 b.
not a a가 거짓인가? a가 참이면 False, 거짓이면 True.

이들을 적절히 조합하여 원하는 논리값을 만들면 됩니다. 예를 들어, a, b, c 중 정확히 둘만 참인지를 확인하려면 다음과 같이 할 수 있습니다.

a = True
b = False
c = True

if (a and b and not c) or (b and c and not a) or (c and a and not b):
    print("정확히 둘만 참입니다.")

논리연산은 사칙연산과 비교연산 다음에 수행됩니다. 또한 not이 가장 먼저 수행되고, and가 그다음, or가 가장 마지막에 수행됩니다. 따라서 사실 위 코드에는 괄호가 필요하지 않습니다. 그러나 논리연산은 순서가 혼동되기 쉬우므로, 적절히 괄호를 사용하여 명확하게 표현하는 것도 좋습니다.

쇼트서킷 평가

위 표에서 정확한 의미를 보면, a and b에서 a가 거짓인 경우와 a or b에서 a가 참인 경우에는 b의 값을 평가할 필요가 없습니다. 이런 경우에 Python은 실제로 b를 평가하지 않습니다. 이를 쇼트서킷 평가(short-circuit evaluation)라고 하며, 성능상 이점이 있을 뿐만 아니라 이 특성을 활용하여 코드를 간결하게 작성할 수도 있습니다. 나중에 나오는 문제들에서 그 활용을 살펴보겠습니다.

논리값과 정수의 관계

논리값과 정수는 서로 변환될 수 있습니다. 명시적으로 변환하려면 int 또는 bool 함수를 사용하면 됩니다.

False1, True0으로 변환됩니다.

print(int(False))  # 0
print(int(True))   # 1

0False, 그 외의 정수는 True로 변환됩니다.

print(bool(0))   # False
print(bool(1))   # True
print(bool(42))  # True
print(bool(-1))  # True

int를 명시적으로 사용하지 않더라도, 정수가 필요한 자리에 논리값이 있다면 암시적으로 변환이 일어납니다. 즉, 위에서 보았던 정확히 둘만 참인지 확인하는 코드는 다음과 같이 간단히 작성할 수도 있습니다.

a = True
b = False
c = True

if a + b + c == 2:
    print("정확히 둘만 참입니다.")

배수와 약수 판정

$n$이 $x$의 배수인 것은 $n$을 $x$로 나눈 나머지가 0인 것과 동치이므로 다음과 같이 판정할 수 있습니다.

n = int(input())
x = int(input())

if n % x == 0:
    print("n은 x의 배수입니다.")
else:
    print("n은 x의 배수가 아닙니다.")

마찬가지로 약수는 반대로 판정하면 됩니다.

댓글