tjd6411   3년 전

print(b < c and a // (c - b) + 1 or-1)

print문에 and or의 역할을 잘 모르겠습니다.

snapflip20   3년 전

확실하지는 않지만 파이썬의 비교 연산자 성질을 생각해 보니 유추가 가능한 것 같습니다.

x and y, x or y와 같은 조건식이 있을 때, 파이썬은 오직 x 조건만 보고 결과를 반환한다는 성질이 있습니다.

이는 bool 대수 표를 떠올려보시면 쉽게 이해하실 수 있을텐데요,

x and y라는 조건식에서 x가 False일 때는 y에 어떤 값이 오더라도 결과는 False밖에 될 수 없으므로 결과는 False이고

x or y라는 조건식에서 x가 True일 때는 y에 어떤 값이 오더라도 결과는 True이기 때문에 결과는 True입니다.

이를 단축 평가(Short Circuit Evaluation)라고 부르는데, 파이썬에서는 이 성질을 좀 더 활용해 조건문을 특이하게 평가를 합니다.

그 결과만 정리해보자면,

x and y 라는 조건식에서 x가 False이면 x를 반환하고, 반대로 x가 True이면 y를 반환합니다.

그리고 x or y 에서는 x가 True일 때 x를 반환하고, x가 False일 때 y를 반환합니다.

조건문에서 True나 False가 아닌 x, y라는 어떤 특정한 값을 반환한다는 게 조금 생소하게 느껴지실 수도 있으실 텐데

실제로 파이썬에서 2 and 0, 4 or 5와 같은 식을 입력해보면 무엇이 출력되는지 확인해보실 수 있습니다.

이제 질문자분께서 올려주신 코드를 분석해보겠습니다.

b < c and a//(c-b)+1 or -1 문장을 보면

맨 앞에 조건식이 하나, 그 뒤에 and와 or이 있습니다.

1. b < c가 True일 경우

b < c가 True이므로 and 뒤의 값인 a//(c-b)+1를 계산한 결과를 반환할 것입니다.

(원본 코드를 잘 모르지만 a//(c-b)+1이 0을 반환하는 경우는 없다고 치겠습니다)

그리고 a//(c-b)+1 or -1을 보겠습니다.

a//(c-b)+1가 True일 테니 or 뒤의 값은 보지도 않고 바로 a//(c-b)+1를 계산한 결과를 반환하게 됩니다.

2. b < c가 False일 경우

먼저 b < c and a//(c-b)+1에서는 b < c(False)를 반환할 것입니다.

그리고 b < c or -1을 보겠습니다.

마찬가지로 앞의 값이 False이므로 바로 뒤의 값 -1을 반환하게 됩니다.

정리하자면

a, b, c를 입력받고

b < c가 True일 때 a//(c-b)+1를,

b < c가 False일 때 -1을 반환하는 코드라고 볼 수 있겠습니다.

비슷하게 if else를 사용하는 방법도 있는데 숏코딩을 위해서인지 and or를 사용한 것 같습니다.

tjd6411   3년 전

감사합니다. 세세하게 잘 알려주셔서 이해했습니다.

댓글을 작성하려면 로그인해야 합니다.