Every Step Matters

[python] &와 and의 차이 본문

Python

[python] &와 and의 차이

imnyoung 2024. 8. 12. 15:12

<문제상황>

백준 2480번 문제를 풀다가 &와 and의 사용에 따라 결과가 달라지는 상황을 발견했다.

 

a, b, c = input().split()   # 2 3 4 입력
a = int(a)
b = int(b)
c = int(c)

print(a!=b & a!=c)   # False
print(a!=b and a!=c) # True

 

입력칸에 2 3 4 시에 첫 번째 출력결과는 False가, 두 번째 출력결과는 True가 나왔다. 나는 둘 다 True가 나올 줄 알았는데...

 

구글링해 보니 &와 and는 엄연히 다른 연산자. and가 내가 사용하려 했던 의도의 논리연산자이고, and 앞뒤의 조건 두 개가 모두 참인 경우 Boolean값인 True를, 그 외의 경우는 False를 반환한다. 반면 &의 경우 연산자는 파이썬에서 비트 연산자로 사용되며, 두 정수의 각 비트를 비교하여 둘 다 1인 경우에만 1을 반환한다고 한다.

 

& 연산자에 대해 조금 더 자세히 알아보자.

 

<비트 연산 예시>

a = 5       # 5는 이진수로 0101
b = 3       # 3은 이진수로 0011

result = a & b  # 0101 & 0011 = 0001
print(result)   # 출력: 1

위 예제에서 5와 3의 비트 연산 수행 결과는 1이 된다.

 

<논리 연산 예시>

논리 연산에서도 & 연산자를 사용할 수는 있다.

논리 연산에서 &는 보통 and와 같은 역할을 하지만, 비트 단위로 연산을 수행합니다. 이 때문에, &를 논리 연산자로 사용할 때는 두 피연산자가 반드시 True나 False로 평가될 수 있는 불리언 값이어야 한다. 만약 불리언 값이 아닌 정수나 비트 단위로 비교 가능한 값이라면, 비트 연산을 수행한다. 즉 비트 단위 비교가 논리 연산보다 우선순위에 있는 것!

a = True
b = False

print(a & b)  # 출력: False (a와 b 모두 True여야 True)

 

내 코드의 오류도 이곳에서 발생한 것 같다.

print(a!=b & a!=c)

위의 코드에서 a!=b와 a!=c 의 비교 연산이 먼저 수행되지 않고 b & a!=c라는 비트 연산이 먼저 수행되어 논리적인 오류가 발생한 것이다. 따라서 이런 경우 & 대신 논리 연산자인 and를 사용하여 조건을 명확하게 표현해야 할 듯 싶다.

 

<백준 2480 문제코드>

# 입력 받기
a, b, c = map(int, input().split())

# 세 가지 조건에 따라 상금 계산
if a == b == c:
    # 같은 눈이 3개 나오는 경우
    result = 10000 + a * 1000
elif a == b or b == c or a == c:
    # 같은 눈이 2개 나오는 경우
    if a == b or a == c:
        result = 1000 + a * 100
    else:
        result = 1000 + b * 100
else:
    # 모두 다른 눈이 나오는 경우
    result = max(a, b, c) * 100

# 결과 출력
print(result)