문제 설명
정수 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 |