윤년
year = int(input())
leap = (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
print(int(leap))
논리연산자
Python에는 and
, or
, not
논리연산자가 있습니다.
논리값으로 평가될 수 있는 두 값 a
와 b
가 있을 때, 논리연산은 다음과 같습니다.
(정확한 의미는 아직 이해하지 않아도 됩니다.)
연산 | 의미 | 정확한 의미 |
---|---|---|
a and b |
a 와 b 가 모두 참인가? |
a 가 거짓이면 a , 참이면 b . |
a or b |
a 와 b 중 적어도 하나가 참인가? |
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
함수를 사용하면 됩니다.
False
는 1
, True
는 0
으로 변환됩니다.
print(int(False)) # 0
print(int(True)) # 1
0
은 False
, 그 외의 정수는 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의 배수가 아닙니다.")
마찬가지로 약수는 반대로 판정하면 됩니다.
댓글