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




             

    문제 설명 

    프로그래머스 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 에이블스쿨 : IT 인프라 (1일차~5일차) 공부 정리

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