프로그래머스 파이썬 기초 트레이닝 :: 간단한 논리연산 (논리연산자, 비트연산자 *)




         

문제 설명 

프로그래머스 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)


x1            x2        x3            x4        result
false        true        true        true        true
true        false        false        false        false





문제 이해

[입력] boolean 변수 (x1, x2, x3, x4) 

[출력] boolean 변수

(x1 ∨ x2) ∧ (x3 ∨ x4) 이 식을 논리연산자 혹은 비트연산자를 사용해 표현하기




------------------------


단계별 정답 코드

논리 연산자  활용

1. 정석 
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))   

비트 연산자  활용

1. 정석 
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 and y 형식, x랑 y 둘 다 참일때만 참
#정수
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)

변수 = a & b
# 정수에 대한 비트 연산
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)

각 비트가 서로 다르면 1을 반환하고, 같으면 0을 반환
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)

각 비트가 서로 다르면 1을 반환하고, 같으면 0을 반환
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 : 둘다 홀수면 각 수의 제곱을 해줌


② elif ( a | b ) & 1 이면, (a + b) << 1 

( a | b ) & 1 : a, b 둘 중에 하나(or)가 1일때라는 것. 하나만 홀수일때 

(a + b) << 1 : 왼쪽으로 1비트만큼 미는거니까, 0이 하나더 생긴다. 즉, 2배곱

 

③ else 이면, abs(a - b)

abs(a - b) : 절대값 abs() 











댓글

이 블로그의 인기 게시물

[KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

KT 에이블스쿨 : 대구광역시 공공데이터 활용 창업경진대회 준비

KT 에이블스쿨 : 핀테크 아이디어 공모전