파이썬 기초 100제(7)

My_Code·2023년 7월 27일

코드업

목록 보기
7/10
post-thumbnail

다음 내용은 코드업에서 공부한 내용을 복습하는 차원에서 기록한 것입니다.
출처 : https://codeup.kr/problemsetsol.php?psid=33

💻 [기초-비트단위논리연산] 비트단위로 NOT 하여 출력하기

⌨️ 문제
입력 된 정수를 비트단위로 참/거짓을 바꾼 후 정수로 출력해보자.
비트단위(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를 의미한다.

예시
a = 1
print(~a) #-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 과 같은 관계로 표현할 수 있다.

이 관계를 그림으로 그려보면 마치 원형으로 수들이 상대적으로 배치된 것과 같다.

👉 입력
정수 1개가 입력된다.
-2147483648 ~ +2147483647

👉 출력
비트 단위로 1 -> 0, 0 -> 1로 바꾼 후 그 값을 10진수로 출력한다.

👉 입력 예시

2

👉 출력 예시

-3

👉 코드

a = int(input())
print(~a)

💻 [기초-비트단위논리연산] 비트단위로 AND 하여 출력하기

⌨️ 문제
입력된 정수 두 개를 비트단위로 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 을 계산할 수 있다.

실제로 이 계산은 네트워크에 연결되어 있는 두 개의 컴퓨터가 데이터를 주고받기 위해
같은 네트워크에 있는지 아닌지를 판단하는데 사용된다.

이러한 비트단위 연산은 빠른 계산이 필요한 그래픽처리에서
마스크연산(특정 부분을 가리고 출력하는)을 수행하는 데에도 효과적으로 사용된다.

👉 입력
2개의 정수가 공백을 두고 입력된다.
-2147483648 ~ +2147483647

👉 출력
두 정수를 비트단위(bitwise)로 and 계산을 수행한 결과를 10진수로 출력한다.

👉 입력 예시

3 5

👉 출력 예시

1

👉 코드

a, b = input().split()
a = int(a)
b = int(b)
print(a & b)

💻 [기초-비트단위논리연산] 비트단위로 OR 하여 출력하기

⌨️ 문제
입력된 정수 두 개를 비트단위로 or 연산한 후 그 결과를 정수로 출력해보자.
비트단위(bitwise) 연산자 |(or, vertical bar, 버티컬바)를 사용하면 된다.

** | 은 파이프(pipe)연산자라고도 불리는 경우가 있다.

** 비트단위(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 00000111
이 된다.

비트단위 or 연산은 둘 중 하나라도 1인 자리를 1로 만들어주는 것과 같다.

이러한 비트단위 연산은 빠른 계산이 필요한 그래픽처리에서도 효과적으로 사용된다.

👉 입력
2개의 정수가 공백을 두고 입력된다.
-2147483648 ~ +2147483647

👉 출력
두 정수를 비트단위(bitwise)로 or 계산을 수행한 결과를 10진수로 출력한다.

👉 입력 예시

3 5

👉 출력 예시

7

👉 코드

a, b = input().split()
a = int(a)
b = int(b)
print(a | b)

💻 [기초-비트단위논리연산] 비트단위로 XOR 하여 출력하기

⌨️ 문제
입력된 정수 두 개를 비트단위로 xor 연산한 후 그 결과를 정수로 출력해보자.
비트단위(bitwise) 연산자 ^(xor, circumflex/caret, 서컴플렉스/카릿)를 사용하면 된다.

** 주의 ^은 수학식에서 거듭제곱(power)을 나타내는 기호와 모양은 같지만,
C언어에서는 전혀 다른 배타적 논리합(xor, 서로 다를 때 1)의 의미를 가진다.

** 비트단위(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 00000110
이 된다.
이러한 비트단위 연산은 빠른 계산이 필요한 그래픽처리에서도 효과적으로 사용된다.

구체적으로 설명하자면,
두 장의 이미지가 겹쳐졌을 때 색이 서로 다른 부분만 처리할 수 있다.
배경이 되는 그림과 배경 위에서 움직이는 그림이 있을 때,
두 그림에서 차이만 골라내 배경 위에서 움직이는 그림의 색으로 바꿔주면
전체 그림을 구성하는 모든 점들의 색을 다시 계산해 입히지 않고
보다 효과적으로 그림을 처리할 수 있게 되는 것이다.
비행기 슈팅게임 등을 상상해보면 된다.

👉 입력
2개의 정수가 공백을 두고 입력된다.
-2147483648 ~ +2147483647

👉 출력
두 정수를 비트단위(bitwise)로 xor 계산을 수행한 결과를 10진수로 출력한다.

👉 입력 예시

3 5

👉 출력 예시

6

👉 코드

a, b = input().split()
a = int(a)
b = int(b)
print(a ^ b)

💻 [기초-3항연산] 정수 2개 입력받아 큰 값 출력하기

⌨️ 문제
입력된 두 정수(a, b) 중 큰 값을 출력하는 프로그램을 작성해보자.
단, 3항 연산을 사용한다.

예시
a, b = input().split()
a = int(a) #변수 a에 저장되어있는 값을 정수로 바꾸어 다시 변수 a에 저장
b = int(b)
c = (a if (a>=b) else b)
print(int(c))

참고
3개의 요소로 이루어지는 3항 연산은
"x if C else y" 의 형태로 작성이 된다.

  • C : True 또는 False 를 평가할 조건식(conditional expression) 또는 값
  • x : C의 평가 결과가 True 일 때 사용할 값
  • y : C의 평가 결과가 True 가 아닐 때 사용할 값

조건식 또는 값이 True 이면 x 값이 사용되고, True가 아니면 y 값이 사용되도록 하는 코드이다.

예를 들어
0 if 123>456 else 1
과 같은 표현식의 평가값은 123 > 456 의 비교연산 결과가 False 이므로 1이 된다.

예시 코드에서
a>=b 의 결과가 True(참) 이면 (a if (a>=b) else b)의 결과는 a가 되고,
a>=b 의 결과가 False(거짓)이면 (a if (a>=b) else b)의 결과는 b가 된다.

👉 입력
두 정수가 공백을 두고 입력된다.
-2147483648 ~ +2147483647

👉 출력
두 정수 중 큰 값을 10진수로 출력한다.

👉 입력 예시

123 456

👉 출력 예시

456

👉 코드

a, b = input().split()
a = int(a)
b = int(b)
# if (a > b):
#     print(a)
# else:
#     print(b)
c = (a if (a > b) else b)
print(c)

💻 [기초-3항연산] 정수 3개 입력받아 가장 작은 값 출력하기

⌨️ 문제
입력된 세 정수 a, b, c 중 가장 작은 값을 출력하는 프로그램을 작성해보자.
단, 3항 연산을 사용한다.

참고
프로그래밍언어 소스코드 작성시 모든 요소들은
"순서에 따라 한 단계씩 실행"
"미리 정해진 순서에 따라 하나씩 연산 수행"
"그 때까지 연산된 결과를 이용해 다시 순서에 따라 하나씩 연산"
...
등의 원리가 적용된다.

따라서 3항 연산을 중첩해(괄호로 묶는 등..) 이용하면 여러 값들을 순서대로 비교해 가장 큰/작은 값을 계산할 수 있다.

예를 들어
(a if a>b else b) if ((a if a>b else b)>c) else c
와 같은 계산식은 a, b, c 의 값 중 가장 큰 값으로 계산된다.

잘 이해가 되지 않는다면 어떤 순서에 따라 계산될 지 생각해보고
여러 가지 연산자가 동시에 사용된 식이 있을 때, 어떤 우선순위에 따라 순서대로 계산이 되는지 찾아보도록 한다.
“연산자 우선순위”를 검색하면 우선순위와 결합방향이 나온다.
예를 들어 변수에 어떤 값을 대입하는 대입(assign) 연산자 = 의 우선순위는 가장 낮고, 오른쪽에서 왼쪽의 결합방향을 가진다.

** 3항 연산은 자주 사용되지는 않지만,
복잡한 계산식이나 조건 처리, 비교 구조를 간단히 표현할 수 있게 해준다.

👉 입력
3개의 정수가 공백으로 구분되어 입력된다.
-2147483648 ~ +2147483648

👉 출력
가장 작은 값을 출력한다.

👉 입력 예시

3 -1 5

👉 출력 예시

-1

👉 코드

a, b, c = input().split()
a = int(a)
b = int(b)
c = int(c)
d = (a if(a < b) else b) if ((a if(a < b) else b) < c) else c
print(d)

💻 [기초-조건/선택실행구조] 정수 3개 입력받아 짝수만 출력하기

⌨️ 문제
3개의 정수(a, b, c)가 입력되었을 때, 짝수만 출력해보자.

예시
a, b, c = input().split()

a = int(a)
b = int(b)
c = int(c)

if a%2==0 : #논리적으로 한 단위로 처리해야하는 경우 콜론(:)을 찍고, 들여쓰기로 작성 한다.
print(a)

if b%2==0 :
print(b)

if c%2==0 :
print(c)

참고
if 조건식 :
실행1 #조건식의 평가값이 True 인 경우 실행시킬 명령을 들여쓰기를 이용해 순서대로 작성한다.
실행2
실행3 #들여쓰기를 하지 않은 부분은 조건식에 상관이 없음

python 에서는 논리적 실행단위인 코드블록(code block)을 표현하기 위해 들여쓰기를 사용한다.
들여쓰기 방법은 탭(tab), 공백(space) 4개 등 여러 가지 방법을 사용할 수 있지만
한 소스코드 내에서 들여쓰기 길이와 방법은 똑같아야 한다.

a%2==0 은 (a%2)가 먼저 계산된 후 그 결과를 정수 0과 비교한 결과값이다.
a를 2로 나눈 나머지가 0, 즉 짝수이면 True 가 되고, 아니면 False 로 계산된다.
따라서,
if a%2==0 : #a가 짝수라면 ...
와 같은 의미가 된다. 짝수가 아니라면 들여쓰기로 작성된 부분들은 실행되지 않는다.

👉 입력
3개의 정수(a, b, c)가 공백을 두고 입력된다.
0 ~ +2147483647 범위의 정수들이 입력되며 적어도 1개는 짝수이다.

👉 출력
짝수만 순서대로 줄을 바꿔 출력한다.

👉 입력 예시

1 2 4

👉 출력 예시

2
4

👉 코드

a, b, c = input().split()
a = int(a)
b = int(b)
c = int(c)

if a % 2 == 0 :
    print(a)
if b % 2 == 0 :
    print(b)
if c % 2 == 0 :
    print(c)

💻 [기초-조건/선택실행구조] 정수 3개 입력받아 짝/홀 출력하기

⌨️ 문제
3개의 정수(a, b, c)가 입력되었을 때, 짝(even)/홀(odd)을 출력해보자.

예시
...
if a%2==0 :
print("even")
else :
print("odd")
...

참고
if 조건식 : #조건식을 평가해서...
실행1 #True 인 경우 실행시킬 명령들...
실행2
else :
실행3 #False 인 경우 실행시킬 명령들...
실행4
실행5 #조건식과 상관없는 다음 명령
...

else 는 if 없이 혼자 사용되지 않는다.
또한, else 다음에는 조건식이 없는 이유는? True(참)가 아니면 False(거짓)이기 때문에...
조건식의 평가 결과는 True 아니면 False 로 계산되기 때문이다.

python 에서는 들여쓰기를 기준으로 코드블록을 구분하므로, 들여쓰기를 정확하게 해주어야 한다.

👉 입력
3개의 정수(a, b, c)가 공백을 두고 입력된다.
0 ~ +2147483647 범위의 정수들이 입력되며 적어도 1개는 짝수이다.

👉 출력
입력된 순서대로 짝(even)/홀(odd)을 줄을 바꿔 출력한다.

👉 입력 예시

1 2 8

👉 출력 예시

odd
even
even

👉 코드

a, b, c = input().split()
a = int(a)
b = int(b)
c = int(c)

if a % 2 == 0 :
    print("even")
else :
    print("odd")

if b % 2 == 0 :
    print("even")
else :
    print("odd")

if c % 2 == 0 :
    print("even")
else :
    print("odd")

💻 [기초-조건/선택실행구조] 정수 1개 입력받아 분류하기

⌨️ 문제
0이 아닌 정수 1개가 입력되었을 때, 음(-)/양(+)과 짝(even)/홀(odd)을 구분해 분류해보자.
음수이면서 짝수이면, A
음수이면서 홀수이면, B
양수이면서 짝수이면, C
양수이면서 홀수이면, D
를 출력한다.

예시
...
if n<0 :
if n%2==0 :
print('A') #주의 : 변수 A와 문자열 'A' / "A" 는 의미가 완전히 다르다.
else :
print('B')
else :
if n%2==0 :
print('C')
else :
print('D')
...

참고
조건/선택 실행구조 안에 다시 조건/선택 실행구조를 "중첩"할 수가 있다.

또한, 중첩된 조건은
...
if (n<0) and (n%2==0) :
print('A')
...
와 같이 논리연산자(not, and, or)를 이용해 합쳐 표현할 수도 있다.
비교연산(<, >, <=, >=, ==, !=) 의 계산 결과는 True 또는 False 의 불(boolean) 값이고,
불 값들 사이의 논리연산(not, and, or)의 결과도 True 또는 False 의 불 값이다.

👉 입력
정수 1개가 입력된다.
-2147483648 ~ +2147483647, 단 0은 입력되지 않는다.

👉 출력
음수이면서 짝수이면, A
음수이면서 홀수이면, B
양수이면서 짝수이면, C
양수이면서 홀수이면, D
를 출력한다.

👉 입력 예시

-2147483648

👉 출력 예시

A

👉 코드

a = int(input())

if a < 0 :
    if a % 2 == 0 :
        print("A")
    else :
        print("B")
else :
    if a % 2 == 0 :
        print("C")
    else :
        print("D")

💻 [기초-조건/선택실행구조] 점수 입력받아 평가 출력하기

⌨️ 문제
점수(정수, 0 ~ 100)를 입력받아 평가를 출력해보자.

평가 기준
점수 범위 : 평가
90 ~ 100 : A
70 ~ 89 : B
40 ~ 69 : C
0 ~ 39 : D
로 평가되어야 한다.

예시
...
if n>=90 :
print('A')
else :
if n>=70 :
print('B')
else :
if n>=40 :
print('C')
else :
print('D')
...

참고
여러 조건들을 순서대로 비교하면서 처리하기 위해서 조건문을 여러 번 중첩할 수 있다.

if 조건식1 :
...
else :
if 조건식2 :
...
else :
if 조건식3 :
...
else :
...
...
와 같이 조건/선택 실행 구조를 겹쳐 작성하면 순서대로 조건을 검사할 수 있다.
어떤 조건이 참이면 그 부분의 내용을 실행하고 전체 조건/선택 구조를 빠져나가게 된다.

if 조건식1 :
...
elif 조건식2 :
...
elif 조건식3 :
...
else :
...
도 똑같은 기능을 한다. elif는 else if 의 짧은 약어라고 생각해도 된다.
elif 를 사용하면 if ... else ... 구조를 겹쳐 사용할 때처럼, 여러 번 안 쪽으로 들여쓰기 하지 않아도 된다.

👉 입력
정수(0 ~ 100) 1개가 입력된다.

👉 출력
평가 결과를 출력한다.

👉 입력 예시

73

👉 출력 예시

B

👉 코드

a = int(input())

if a >= 90 :
    print("A")
elif a >= 70 :
    print("B")
elif a >= 40 :
    print("C")
else :
    print("D")

💻 [기초-조건/선택실행구조] 점수 입력받아 평가 출력하기

⌨️ 문제
점수(정수, 0 ~ 100)를 입력받아 평가를 출력해보자.

평가 기준
점수 범위 : 평가
90 ~ 100 : A
70 ~ 89 : B
40 ~ 69 : C
0 ~ 39 : D
로 평가되어야 한다.

예시
...
if n>=90 :
print('A')
else :
if n>=70 :
print('B')
else :
if n>=40 :
print('C')
else :
print('D')
...

참고
여러 조건들을 순서대로 비교하면서 처리하기 위해서 조건문을 여러 번 중첩할 수 있다.

if 조건식1 :
...
else :
if 조건식2 :
...
else :
if 조건식3 :
...
else :
...
...
와 같이 조건/선택 실행 구조를 겹쳐 작성하면 순서대로 조건을 검사할 수 있다.
어떤 조건이 참이면 그 부분의 내용을 실행하고 전체 조건/선택 구조를 빠져나가게 된다.

if 조건식1 :
...
elif 조건식2 :
...
elif 조건식3 :
...
else :
...
도 똑같은 기능을 한다. elif는 else if 의 짧은 약어라고 생각해도 된다.
elif 를 사용하면 if ... else ... 구조를 겹쳐 사용할 때처럼, 여러 번 안 쪽으로 들여쓰기 하지 않아도 된다.

👉 입력
정수(0 ~ 100) 1개가 입력된다.

👉 출력
평가 결과를 출력한다.

👉 입력 예시

73

👉 출력 예시

B

👉 코드

a = int(input())

if a >= 90 :
    print("A")
elif a >= 70 :
    print("B")
elif a >= 40 :
    print("C")
else :
    print("D")

profile
조금씩 정리하자!!!

0개의 댓글