주어진 자연수가 짝수인지 홀수인지에 따라 각각 'Even'과 'Odd'를 return하는 문제
나의 풀이
def solution(num):
return 'Odd' if num % 2 else 'Even'
다른분들 풀이
def solution(num):
# 풀이1
return (num % 2 and 'Odd') or 'Even'
# 풀이2
return ['Even', 'Odd'][num & 1]
이 외에 다른 풀이도 있었지만, 위의 두 풀이가 제일 인상깊어서 가져왔다.
의 경우 조건을 판단할 때는
'둘 다' '참' 이어야 '참'이되는 and와
'둘 중 하나만' '참'이면 '참'이 되는 or
라고 막연히 생각만 하고 있었는데,
어떻게 리턴되길래 참이고 거짓인건지는 잊어버리고 있었다.
and, or연산자의 경우
'결과를 결정하는 항'이 return된다고 알고 있으면 편하다.
번호 | 좌변 | 우변 | 결과 |
---|---|---|---|
1 | 참1 | 참2 | 참2 |
2 | 참1 | 거짓1 | 거짓1 |
3 | 거짓1 | 참1 | 거짓1 |
4 | 거짓1 | 거짓2 | 거짓1 |
1번식의 경우, 첫 항이 참이므로 결과를 결정하는 것은 우변의 참2가 된다.
그래서 return값은 참2가 된다.
2번 식의 경우도 마찬가지로 첫 항이 참이므로 결과를 결정하는 것은 우변이 된다.
그래서 거짓1이 리턴된다.
3의 경우 좌변의 항이 거짓이므로 우변은 볼 필요조차 없다. 그래서 거짓1이 리턴된다.
4의 경우도 3번 식과 같다.
or는 둘 중 하나만 참이면 되기 때문에
좌변의 값이 참이면 우변은 볼 필요도 없이 좌변을 리턴하면 된다.
만일 좌변의 값이 거짓이면 결과는 어차피 우변의 값에 의해서 결정되기 때문에 우변을 리턴하면 된다.
그래서 아래와 같은 결과가 나온다.
번호 | 좌변 | 우변 | 결과 |
---|---|---|---|
1 | 참1 | 참2 | 참1 |
2 | 참1 | 거짓1 | 참1 |
3 | 거짓1 | 참1 | 참1 |
4 | 거짓1 | 거짓2 | 거짓2 |
def solution(num):
# and, or사용
return (num % 2 and 'Odd') or 'Even'
num이 짝수일 때, num%2는 0 즉 False가 된다.
or 연산의 좌변인 num % 2 and 'Odd'가 False가 되는 것이다.
or연산의 규칙에 따라 좌변이 False이면 우변을 리턴한다.
따라서 num이 짝수이면 알맞게 'Even'이 리턴된다.
numdl 홀수이면 num%2는 1이므로 True가 된다.
and연산은 좌변의 항이 참이면 결과를 결정하는 우변을 리턴하기 때문에
괄호 안에 있는 식의 리턴 값은 'Odd'가 된다.
그럼 결국 'Odd' or 'Even'인 True1 or True2의 연산이 되므로
True1인 'Odd'를 알맞게 리턴한다.
풀이 2는
def solution(num):
return ['Even', 'Odd'][num & 1]
배열의 인덱스를 사용하여 리턴하였다.
['Even', 'Odd']는 각각 0, 1의 인덱스를 갖는다.
비트연산자 &의 경우 두 자릿수가 모두 1이어야 1이 된다.
번호 | 비트1 | 비트2 | 결과 |
---|---|---|---|
1 | 0 | 0 | 0 |
2 | 0 | 1 | 0 |
3 | 1 | 0 | 0 |
4 | 1 | 1 | 1 |
홀수의 경우 2진수로 변환하면 맨 마지막 자리의 값이 '1'이므로
1과 & 연산을 하면 결과값은 1이 된다.
['Even', 'Odd'][1] #'Odd'
짝수의 경우 마지막 자리의 값이 0이기 때문에
1과 &연산을 하면 0이 된다.
['Even', 'Odd'][0] #'Even'
따라서 위의 식처럼 인덱스로 정답을 리턴할 수 있었던 것이다....
생각도 못했다. 와 재밌당
짝수 홀수도 이렇게 다양한 방법으로 풀 수 있다니 신기하다.