코드로 우주평화
짝수와 홀수 3가지 풀이법(if, dict, list) 그리고 bitwise 본문
문제 설명
정수 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진 수 까지 들어가는 것은 좀 오버가 아닐까 싶다...)
레퍼런스
'나는 이렇게 학습한다 > Algorithm & SQL' 카테고리의 다른 글
정수 제곱근 판별 (0) | 2022.01.22 |
---|---|
if 사용하지 않고 제일 작은 수 제거하기 (0) | 2022.01.21 |
최대공약수와 최소공배수 (0) | 2022.01.19 |
콜라츠 추측 (0) | 2022.01.18 |
평균 구하기 (0) | 2022.01.17 |