알고리즘 공부를 위해 코드업 사이트(https://codeup.kr/)의 기초 100제를 시작합니다.

블로그에 올라온 모든 코드는 파이썬(Python)으로 작성되어 있습니다.   

 

Python의 기초 100제를 확인하기 위해서는 다음 사이트로 이동하면 됩니다. 

https://codeup.kr/problemsetsol.php?psid=33 

 

문제집 / Python 기초 100제

 

codeup.kr

 

6061 : [기초-비트단위논리연산] 비트단위로 OR 하여 출력하기(설명)(py)

입력된 정수 두 개를 비트단위로 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로 만들어주는 것과 같다.

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

 

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

 

6062 : [기초-비트단위논리연산] 비트단위로 XOR 하여 출력하기(설명)(py)

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

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

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

 

6063 : [기초-3항연산] 정수 2개 입력받아 큰 값 출력하기(설명)(py)

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

 

▷ 참고

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가 된다.

 

▷ 해설

3항 연산을 너무 어렵게 받아 들이지 말고 if문 앞의 값은 조건이 맞을 경우 나오고 else 뒤의 값은 조건이 틀리면 나오는 값으로 이해한다.

이번 문제에서는 a와 b중 큰 값을 구하려 했으니 조건인 a가 b보다 크다면에 만족하면 a를 출력하고 그외에는 b를 출력한다.

a, b = input().split()

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

print(a if (a >= b) else b)

 

6064 : [기초-3항연산] 정수 3개 입력받아 가장 작은 값 출력하기(설명)(py)

입력된 세 정수 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항 연산으로 비교하기 위해서는 두개의 삼항 연산자가 필요하다.

 

a if (a<b) else b)

첫번째 삼항연산자에서는

두 값 a와 b에 대해서만 크기를 비교한다. a가 b보다 작을 경우 a가 되며 b가 a보다 작을 경우 b가 된다.

 

'첫번째 삼항연산자' if ('첫번째 삼항연산자'< c) else c

두번째 삼항연산자에서는 첫번째 삼항연산자를 둘 중 작은 값을 가진 하나의 수로 보고 식을 전개해야한다.

첫번째 삼항연산자가 c보다 작을 경우 첫번째 삼항연산자의 값이 가장 작은 값이 되며 그 반대의 경우 c가 두 수중 작은 값보다도 작다는 것을 통해 가장 작은값이 될 수 있다.  

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

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

print((a if (a<b) else b) if (( a if (a<b) else b) < c) else c)

 

6065 : [기초-조건/선택실행구조] 정수 3개 입력받아 짝수만 출력하기(설명)(py)

3개의 정수(a, b, 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가 짝수라면 ... 
와 같은 의미가 된다. 짝수가 아니라면 들여쓰기로 작성된 부분들은 실행되지 않는다.

 

▷ 해설

문제에서 원하는 짝수를 구하기 위해서는 조건문(if문)을 이용한 판별이 필요하다.

짝수는 2로 나눠지는 값이므로 2로 나눈 나머지가 0이 된다는 특징을 이용하여 n%2 == 0 이면 짝수가 된다는걸 우리는 알 수 있다.

이걸 각 수에 적용하기 위해 3개의 조건문을 통해 입력된 모든 수가 짝수인지 일일이 확인한다.

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)

+ Recent posts