알고리즘 공부를 위해 코드업 사이트(https://codeup.kr/)의 기초 100제를 시작합니다.
블로그에 올라온 모든 코드는 파이썬(Python)으로 작성되어 있습니다.
Python의 기초 100제를 확인하기 위해서는 다음 사이트로 이동하면 됩니다.
https://codeup.kr/problemsetsol.php?psid=33
6056 : [기초-논리연산] 참/거짓이 서로 다를 때에만 참 출력하기(설명)(py)
2개의 정수값이 입력될 때,
그 불 값(True/False) 이 서로 다를 때에만 True 를 출력하는 프로그램을 작성해보자.
▷ 참고
참 거짓이 서로 다를 때에만 True 로 계산하는 논리연산을 XOR(exclusive or, 배타적 논리합) 연산이라고도 부른다.
논리연산자는 사칙(+, -, *, /) 연산자와 마찬가지로 여러 번 중복해서 사용할 수 있는데,
사칙 연산자와 마찬가지로 계산 순서를 표시하기 위해 괄호 ( )를 사용할 수 있다.
괄호를 사용하면 계산 순서를 명확하게 표현할 수 있다.
수학 식에서는 소괄호 (), 중괄호 {}, 대괄호 []를 사용하기도 하지만, 프로그래밍언어에서는 소괄호 ( ) 만 사용한다.
불 대수(boolean algebra)는 수학자 불이 만들어낸 것으로 True(참)/False(거짓) 값만 가지는 논리값과 그 값들 사이의 연산을 다룬다.
▷ 해설
배타적 논리합인 XOR의 경우 두 값이 같은 경우 False가 나온다.
즉, a와 b가 모두 True이거나 False인 경우를 제외한 경우인 a는 True지만 b는 False인 경우나 a는 False지만 b는 True인 경우에 최종 결과로 True를 가진다.
위의 표와 같이 전개하게 되면 정상적으로 XOR을 구할 수 있다.
a, b = input().split()
boolA = bool(int(a))
boolB = bool(int(b))
print((boolA and (not boolB)) or (not boolA and (boolB)))
6057 : [기초-논리연산] 참/거짓이 서로 같을 때에만 참 출력하기(설명)(py)
2개의 정수값이 입력될 때,
그 불 값(True/False) 이 서로 같을 때에만 True 를 출력하는 프로그램을 작성해보자.
▷ 해설
먼저 입력받은 값의 bool 값을 구한뒤 관계 연산자를 통해 두 값이 같은지 비교하면 된다.
다음과 같이 == 연산자를 이용하게 되면 True, True의 경우나 False, False의 경우에만 True가 출력된다.
또는 위의 표와 같이 not과 and와 or을 이용하면 답을 구할 수 있다.
a, b = input().split()
boolA = bool(int(a))
boolB = bool(int(b))
print(boolA == boolB)
a, b = input().split()
boolA = bool(int(a))
boolB = bool(int(b))
print(((not boolA) and (not boolB)) or (boolA and boolB))
6058 : [기초-논리연산] 둘 다 거짓일 경우만 참 출력하기(py)
2개의 정수값이 입력될 때,
그 불 값(True/False) 이 모두 False 일 때에만 True 를 출력하는 프로그램을 작성해보자.
▷ 해설
(not boolA) and (not boolB)와 not (boolA and boolB)는 같은 의미를 가지고 있다.
a, b = input().split()
boolA = bool(int(a))
boolB = bool(int(b))
print((not boolA) and (not boolB))
6059 : [기초-비트단위논리연산] 비트단위로 NOT 하여 출력하기(설명)(py)
입력 된 정수를 비트단위로 참/거짓을 바꾼 후 정수로 출력해보자.
비트단위(bitwise)연산자 ~ 를 붙이면 된다.(~ : tilde, 틸드라고 읽는다.)
비트단위(bitwise) 연산자는,
~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor),
<<(bitwise left shift), >>(bitwise right shift) 가 있다.
예를 들어 1이 입력되었을 때 저장되는 1을 32비트 2진수로 표현하면
00000000 00000000 00000000 00000001 이고,
~1은 11111111 11111111 11111111 11111110 가 되는데 이는 -2를 의미한다.
▷ 참고
컴퓨터에 저장되는 모든 데이터들은 2진수 형태로 바뀌어 저장된다.
0과 1로만 구성되는 비트단위들로 변환되어 저장되는데,
양의 정수는 2진수 형태로 바뀌어 저장되고, 음의 정수는 "2의 보수 표현"방법으로 저장된다.
양의 정수 5를 32비트로 저장하면,
5의 2진수 형태인 101이 32비트로 만들어져
00000000 00000000 00000000 00000101
로 저장된다.(공백은 보기 편하도록 임의로 분리)
32비트 형의 정수 0은
00000000 00000000 00000000 00000000
그리고 -1은 0에서 1을 더 빼고 32비트만 표시하는 형태로
11111111 11111111 11111111 11111111 로 저장된다.
-2는 -1에서 1을 더 빼면 된다.
11111111 11111111 11111111 11111110 로 저장된다.
이러한 내용을 간단히 표현하면, 정수 n이라고 할 때,
~n = -n - 1
-n = ~n + 1 과 같은 관계로 표현할 수 있다.
이 관계를 그림으로 그려보면 마치 원형으로 수들이 상대적으로 배치된 것과 같다.
a = int(input())
print(~a)
6060 : [기초-비트단위논리연산] 비트단위로 AND 하여 출력하기(설명)(py)
입력된 정수 두 개를 비트단위로 and 연산한 후 그 결과를 정수로 출력해보자.
비트단위(bitwise)연산자 &를 사용하면 된다.(and, ampersand, 앰퍼센드라고 읽는다.)
비트단위(bitwise)연산자는,
~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor),
<<(bitwise left shift), >>(bitwise right shift) 가 있다.
▷ 참고
예를 들어 3과 5가 입력되었을 때를 살펴보면
3 : 00000000 00000000 00000000 00000011
5 : 00000000 00000000 00000000 00000101
3 & 5 : 00000000 00000000 00000000 00000001
이 된다.
비트단위 and 연산은 두 비트열이 주어졌을 때,
둘 다 1인 부분의 자리만 1로 만들어주는 것과 같다.
이 연산을 이용하면 어떤 비트열의 특정 부분만 모두 0으로도 만들 수 있는데
192.168.0.31 : 11000000.10101000.00000000.00011111
255.255.255.0 : 11111111.11111111.11111111.00000000
두 개의 ip 주소를 & 연산하면
192.168.0.0 : 110000000.10101000.0000000.00000000 을 계산할 수 있다.
실제로 이 계산은 네트워크에 연결되어 있는 두 개의 컴퓨터가 데이터를 주고받기 위해
같은 네트워크에 있는지 아닌지를 판단하는데 사용된다.
이러한 비트단위 연산은 빠른 계산이 필요한 그래픽처리에서
마스크연산(특정 부분을 가리고 출력하는)을 수행하는 데에도 효과적으로 사용된다.
a, b = input().split()
print(int(a) & int(b))
'공부' 카테고리의 다른 글
코드업 파이썬(Python) 기초 100제 - 6066번 ~ 6070번 (0) | 2021.06.18 |
---|---|
코드업 파이썬(Python) 기초 100제 - 6061번 ~ 6065번 (0) | 2021.06.18 |
코드업 파이썬(Python) 기초 100제 - 6051번 ~ 6055번 (0) | 2021.06.18 |
코드업 파이썬(Python) 기초 100제 - 6046번 ~ 6050번 (0) | 2021.06.18 |
코드업 파이썬(Python) 기초 100제 - 6041번 ~ 6045번 (0) | 2021.06.17 |