나는 이렇게 학습한다/Algorithm & SQL

짝수와 홀수 3가지 풀이법(if, dict, list) 그리고 bitwise

daco2020 2022. 1. 21. 02:04
반응형

문제 설명

정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

 

제한 조건

num은 int 범위의 정수입니다.

0은 짝수입니다.

 

해결 방법

def solution(num):
    # 첫 번째 방법 : if-삼항연산자
    return "Odd" if num % 2 == 1 else "Even"
    
    # 두 번째 방법 : dict-key
    return { 1 : 'Odd', 0 : 'Even'}[num % 2]

    # 세 번째 방법 : list-index
    return ["Even", "Odd"][num & 1] # or [num % 2]

 

이 문제는 보자마자 1분 만에 풀었다. (홀짝? 이건 너무 쉽잖아!)

 

처음 푼 방법은 if-삼항연산자였다. % 연산자를 이용하여 몫을 구하면 해당 숫자가 홀수인지 짝수인지 쉽게 알 수 있다. 이를 if-삼항연산자로 값을 반환했다.

 

하지만 이대로 끝내기에는 너무 아쉬운 것 같아 다른 방법도 생각해보았다. 2차 프로젝트때 병민 님께 배운 딕셔너리로 값을 찾는 방법이 생각났다. 처음에는 딕셔너리 변수를 만들어 [key]를 이용해 값을 찾았는데, 혹시 몰라 변수를 만들지 않고 해 보니 그래도 값을 찾을 수 있더라. 그래서 의기양양하게 한 줄 코드로 답을 제출했다.

 

 

제출 후 다른 사람들의 풀이를 살펴보았는데 딕셔너리로 푼 사람은 하나도 보지 못했다. 괜히 뿌듯했다. 그런데 'if'도 '딕셔너리'도 아닌 '리스트-인덱스'로 푼 코드가 있었다! 와우..! 생각해보니 숫자를 2로 나눈 몫은 0 또는 1 뿐이므로 반환 값을 리스트로 만들어 인덱스로 쉽게 찾을 수 있었다!

 

그런데 해당 코드는 '%'가 아닌, '&' (bitwise) 연산자를 활용한 것이 인상적이었다. 사실 bitwise 연산자는 이번에 처음 접했다. 검색해보니 &의 경우 해당 숫자를 2진 수로 바꾸고 같은 자리의 2진 수가 1인 경우에 해당 숫자를 반환한다.

 

이렇게 말하면 어렵겠지? 아래 코드를 보자.

#-----------------------
result = 7 & 2

print(result)

#         7 = 0000 0111
#      &  2 = 0000 0010
#-----------------------
# result, 2 = 0000 0010 # 2번째 자리의 1이 같으므로 0000 0010 을 반환한다. 




#-----------------------
result = 9 & 3

print(result)

#         9 = 0000 1001
#      &  3 = 0000 0011
#-----------------------
# result, 1 = 0000 0001 # 1번째 자리의 1이 같으므로 0000 0001 을 반환한다.

 

이 예제를 보고서야 이해가 되었다. num & 1 의 경우에는 '1'이 2진 수로 '0001' 이기 때문에 num이 어떤 수 이든 '0001', '0000' 이 두 가지로만 반환한다. 즉, 1 또는 0 만 반환되는 것이다. 

 

홀짝 문제는 매우 쉬운 문제이지만 쉽게 풀었다고 그냥 넘어갔다면 bitwise에 대해서는 언제 알게 되었을지 가늠이 안된다... 앞으로 문제를 풀 때에는 내 문제 풀이뿐만 아니라 다른 사람들의 풀이도 꼭 봐야겠다. 나는 지금 문제를 빨리 푸는게 목적이 아니라, 알고리즘과 파이썬을 공부하기 위해 풀고 있다는 것을 잊지 말자!

 

(그런데 솔직히 말하자면 홀짝 문제를 구하는데 굳이 2진 수 까지 들어가는 것은 좀 오버가 아닐까 싶다...)

 

 


 

 

레퍼런스

Python - 'and'와 '&'의 차이점

 

 

 

 

 

 

반응형

'나는 이렇게 학습한다 > Algorithm & SQL' 카테고리의 다른 글

정수 제곱근 판별  (0) 2022.01.22
if 사용하지 않고 제일 작은 수 제거하기  (0) 2022.01.21
최대공약수와 최소공배수  (0) 2022.01.19
콜라츠 추측  (0) 2022.01.18
평균 구하기  (0) 2022.01.17