프로그래머스 파이썬 기초 트레이닝 :: 간단한 논리연산 (논리연산자, 비트연산자 *)
문제 설명
프로그래머스 URL
https://school.programmers.co.kr/learn/courses/30/lessons/181917
프로그래머스 코딩 카테고리
코딩 기초 트레이닝
Day 8 조건문, 문자열 - 간단한 논리연산
Lv.0
문제 내용
boolean 변수 x1, x2, x3, x4가 매개변수로 주어질 때, 다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요.
(x1 ∨ x2) ∧ (x3 ∨ x4)
문제 이해
[입력] boolean 변수 (x1, x2, x3, x4)
[출력] boolean 변수
(x1 ∨ x2) ∧ (x3 ∨ x4) 이 식을 논리연산자 혹은 비트연산자를 사용해 표현하기
------------------------
단계별 정답 코드
논리 연산자 활용
def solution(x1, x2, x3, x4):
if (x1 | x2) & (x3 | x4) :
return True
return False
2. 두 줄 코드
def solution(x1, x2, x3, x4):
return (x1 | x2) & (x3 | x4)
3. 한 줄 코드
solution = lambda x1, x2, x3, x4 : ((x1 | x2) & (x3 | x4))
비트 연산자 활용
def solution(x1, x2, x3, x4):
if (x1 or x2) and (x3 or x4) :
return True
return False
2. 두 줄 코드
def solution(x1, x2, x3, x4):
return (x1 or x2) and (x3 or x4)
3. 한 줄 코드
solution = lambda x1, x2, x3, x4 : (x1 or x2) and (x3 or x4)
논리 연산자
두 개 이상의 조건을 조합할 때 사용함
입력값 : 정수, 리스트, 집합, 문자열 등
리턴값 : boolean (True / False)
AND 연산자
#정수
x, y = 10, 5
result_and = (x > 5) and (y < 10) # True
#리스트
list1 = [1, 2, 3]
list2 = [3, 4, 5]
result_and_list = (len(list1) > 2) and (len(list2) > 2) # True
#집합
set1 = {1, 2, 3}
set2 = {3, 4, 5}
result_and_set = (2 in set1) and (4 in set2) # False
#문자열
str1 = "Hello"
str2 = "World"
result_and_str = ('e' in str1) and ('W' in str2) # True
OR 연산자
x or y 형식, 하나가 참이면 참
#정수
result_or = (x > 5) or (y > 10) # True
#리스트
result_or_list = (3 in list1) or (6 in list2) # True
#집합
result_or_set = (len(set1) > 3) or (len(set2) > 3) # True
#문자열
result_or_str = (len(str1) > 5) or (len(str2) > 5) # True
NOT 연산자
x not 형식, x가 참이면 거짓을 반환하고, x가 거짓이면 참을 반환
#정수
result_not = not (x < 10) # True
#리스트
result_not_list = not (len(list1) == 0) # True
#집합
result_not_set = not (len(set1) == 0) # True
#문자열
result_not_str = not (len(str1) == 0) # True
비트 연산자
이진수로 표현된 데이터의 비트 단위 조작에 사용됨
입력값 : 집합, 정수, boolean
리턴값 : 정수
& 연산자 (비트 AND)
# 정수에 대한 비트 연산
num1 = 5 # 0b0101
num2 = 3 # 0b0011
result = num1 & num2 # 0b0001 (결과: 1)
# 집합에 대한 집합 연산
set1 = {1, 2, 3}
set2 = {3, 4, 5}
result = set1 & set2 # {3}
# 불리언 값에 대한 비트 연산
bool1 = True
bool2 = False
result = bool1 & bool2 # 0 (False를 나타내는 정수 0으로 반환)
| 연산자 (비트 OR)
변수 = a | b
# 정수에 대한 비트 연산
num1 = 5 # 0b0101
num2 = 3 # 0b0011
result = num1 | num2 # 7
# 집합에 대한 집합 연산
set1 = {1, 2, 3}
set2 = {3, 4, 5}
result = set1 | set2 # {1, 2, 3, 4, 5}
# 불리언 값에 대한 비트 연산
bool1 = True
bool2 = False
result = bool1 | bool2 # 1 (True를 나타내는 정수 1으로 반환)
^ 연산자 (비트 XOR)
num1 = 5 # 0b0101
num2 = 3 # 0b0011
result1 = num1 ^ num2 # 6
# 집합에 대한 집합 연산
set1 = {1, 2, 3}
set2 = {3, 4, 5}
result2 = set1 ^ set2 # {1, 2, 4, 5}
# 불리언 값에 대한 비트 연산
bool1 = True
bool2 = False
result3 = bool1 ^ bool2 # True
~ 연산자 (비트 NOT)
num = 5 # 0b0101
result = ~num # 0b1010
print(result) # 출력: -6
num2 = 12 # 0b1100
result2 = ~num2 # 0b0011
print(result2) # 출력: -13
<<, >> 연산자 (비트 곱하기, 나누기)
변수 = a << num 혹은 a >> num
a = 1
# 이진수로는 1
result = a << 3
# 왼쪽으로 3 비트 시프트
# 결과는 8 (2^3)
result = a >> 2
# 오른쪽으로 2 비트 시프트
# 결과는 0 (1을 2^2로 나누면 소수점 이하 버림)
<< 로 하면, 비트 끝쪽에 영을 덧붙이는거라서 2의 n제곱한 값
>> 로 하면, 비트를 줄이는거라서, 2제곱씩 나누기가 된다.
비트 연산자 문제
Day-23 (4) 주사위 게임 1
[문제설명]
1부터 6까지 숫자가 적힌 주사위가 두 개 있습니다. 두 주사위를 굴렸을 때 나온 숫자를 각각 a, b라고 했을 때 얻는 점수는 다음과 같습니다.
a와 b가 모두 홀수라면 a2 + b2 점을 얻습니다.
a와 b 중 하나만 홀수라면 2 × (a + b) 점을 얻습니다.
a와 b 모두 홀수가 아니라면 |a - b| 점을 얻습니다.
두 정수 a와 b가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
a b result
3 5 34
6 1 14
2 4 2
내가 쓴 코드
def solution(a, b):
if a % 2 and b % 2 :
return a**2 + b**2
elif a % 2 or b % 2 :
return 2 * (a + b)
else :
return abs(a - b)
위 코드를 비트연산자를 쓰면, 이렇게 간결하게 가능하다.
비트 연산자 (<<, |, &) 코드
def solution(a, b):
return a*a+b*b if a & b & 1 else (a + b) << 1 if (a | b) & 1 else abs(a - b)
① if a & b & 1 이면, a*a + b*b
a & b & 1 : a, b 둘다 끝자리가 1일때라는 것이다. 끝자리가 1이면 홀수를 의미함
a*a + b*b : 둘다 홀수면 각 수의 제곱을 해줌
( a | b ) & 1 : a, b 둘 중에 하나(or)가 1일때라는 것. 하나만 홀수일때
(a + b) << 1 : 왼쪽으로 1비트만큼 미는거니까, 0이 하나더 생긴다. 즉, 2배곱
③ else 이면, abs(a - b)
댓글
댓글 쓰기