청소년IT경시대회 프로그래밍 언어(파이썬) 대비

아두위키 : Arduwiki

진법 (2진법, 8진법, 16진법), 비트 연산자

N진법 ?

N진법이란 0~N-1로 각 자리를 표현해 나타내는 수 입니다.

일반적으로 우리가 사용하는 숫자는 10진수입니다. 각 자리를 0~9로 나타내기 때문에 10진수이죠!

0~9 의 수로 숫자를 나타내다가 더이상 표현할 수 없을 때 한 자리를 높여 다음 자리를 표현합니다.


예를 들어, 38 + 75를 그림으로 알아봅시다.

일의 자리를 먼저 더한 결과를 생각해보면 13입니다. 10진수는 각 자리에 0~9까지만 나타낼 수 있으므로 1을 십의 자리로 올려 계산합니다.

다음 10의 자리를 계산해봅시다. 3과 8을 더한 결과는 10입니다. 일의 자리에서 올라온 1과 함께 계산하면 11입니다. 10진수는 각 자리에 0~9까지만 나타낼 수 있으므로 백의 자리로 1을 올려 계산합니다.

우리가 항상 더하기 한 결과를 위와 같은 과정으로 나타내 보았습니다.

▶ 2진수 더하기 계산 방법

그럼 2진수 더하기를 한 번 예시를 통해 확인해봅시다.

2진수는 각 자리를 0~1로 표현할 수 있습니다. 합한 결과가 2가 되면 다음 자리로 1을 올림하여 계산하면 됩니다.

예를 들어, 101 + 111를 그림으로 알아봅시다.

먼저 10진수처럼 맨 뒤 자리부터 계산합니다.

1 + 1 은 2입니다. 2진수는 각 자리를 0~1로 나타낼 수 있기 때문에 1을 다음 자리로 올려 계산합니다.

다음 자리를 계산해봅시다. 0과 1을 더한 값과 넘어온 1을 함께 계산하면 2입니다. 2진수는 각 자리를 0~1로 나타낼 수 있기 때문에 1을 다음 자리로 올려 계산합니다.

다음 자리를 계산해봅시다. 1과 1을 더한 값과 넘어온 1을 함께 계산하면 3입니다. 2진수는 각 자리를 0~1로 나타낼 수 있기 때문에 1을 다음 자리로 올려 계산합니다.

이진수 101 + 111 의 결과는 1100입니다. 숫자가 0과 1만 존재하는 수라고 생각해보면 쉬워요!

▶ 2진수 더하기 퀴즈

아래 3개의 문제를 직접 계산해보고 선생님께 확인 받으세요.

1) 1110 + 101 = ?

2) 10101 + 1101 = ?

3) 1011 + 1101 = ?

1. 2진수

위에서 간단히 2진수에 대해서 확인해보았습니다.

2진수는 0~1로 이루어진 수 입니다.


2진수의 값을 나타내는 방법에 대해서 배워봅시다.

먼저 너무나도 당연하게 사용하는 10진수를 생각해봅시다.

[19803] 라는 수가 있다면 이 수를 나타내는 방법은 아래와 같습니다.

10진수는 위의 표처럼 나타내고 사용합니다.

1 X 10000 + 9 X 1000 + 8 X 100 + 0 X 10 + 3 X 1


10진수와 2진수는 각 자리를 나타내는 수의 크기가 다를 뿐 개념은 같습니다.

[101011] 라는 수는 어떻게 표현할까요?

2진수를 나타내는 방법을 표로 나타내면 아래와 같습니다.

10진수와 마찬가지로 위의 표처럼 나타내고 사용합니다.

1 X 32 + 0 X 16 + 1 X 8 + 0 X 4 + 1 X 2 + 1 X 1

따라서 [101011]라는 이진수를 십진수로 나타내면 위의 계산을 통해 [43]라는 것을 알 수 있습니다.

2. 10진수 → 2진수 변환하기

2진수에 대해서 알아보았습니다. 그럼 10진수 N이라는 값을 2진수로 변환하는 방법을 알아봅시다.

1) 2진수 변환 방법① : 2진수 자리를 이용해 채우기

위에서 배운 것을 이용해 각 자리를 생성하고 10진수의 값을 차례로 값을 넣어보면 됩니다.

10진수 [86]을 2진수로 나타내봅시다.


86를 2진수로 변환하기 위해서 2진수 표를 만들어봅시다.

가장 큰 자리 수부터 채우면 됩니다.


현재 만든 표에서는 가장 큰 수가 128입니다. 그러나 86은 128보다 작아서 128자리는 0으로 채우고 넘어갑니다.


다음은 64자리 입니다. 64자리를 1로 채웁니다.


남은 값 [22]를 이용해 다음 자리를 계산합니다.

다음 자리는 32입니다. 22는 32보다 작아서 32자리는 0으로 채우고 넘어갑니다.


다음은 16자리 입니다. 16자리를 1로 채웁니다.


남은 값 [6]을 이용해 다음 자리를 계산합니다.

다음 자리는 8입니다. 6은 8보다 작아서 8자리는 0으로 채우고 넘어갑니다.


다음은 4자리 입니다. 4자리를 1로 채웁니다.


남은 값 [2]를 이용해 다음 자리를 계산합니다.

2자리를 1로 채웁니다. 남은 값은 0이므로 나머지 칸을 모두 0으로 채웁니다.


결과적으로 10진수 [86]을 2진수로 변환하면 [1010110]입니다.

2) 2진수 변환 방법② : 2로 나눈 몫과 나머지를 이용해 변환하기

두 번째 방법은 10진수 값을 2로 나눈 몫과 나머지를 계산하여 2진수로 변환하는 방법입니다.

이 방법이 더 쉬울 수 있어요!

위의 예제처럼 [86]을 2진수로 변환하는 과정을 아래 그림으로 알아봅시다.


아래 그림처럼 86을 계속 2로 나눠봅시다. 몫이 1이될 때까지 몫과 나머지를 작성합니다.

몫이 1이 되는 경우까지 작성 후 주황선을 따라 순서대로 값을 적어주면 10진수 값을 2진수로 변환한 값입니다.

따라서 10진수 [86]을 2진수로 변환하면 [1010110]입니다.

위에서 2진수의 자리를 채워 변환하는 방법과 같은 값이 나오는 것을 확인할 수 있습니다.

▶ 10진수 → 2진수 변환 퀴즈

아래 3개의 문제를 직접 계산해보고 선생님께 확인 받으세요.

1) 57 → ?

2) 19 → ?

3) 156 → ?

▶ 2진수 → 10진수 변환 퀴즈

아래 3개의 문제를 직접 계산해보고 선생님께 확인 받으세요.

1) 1000100 → ?

2) 11111 → ?

3) 101101 → ?

3. 8진수

10진수와 2진수에 대해 공부해보았습니다.

그럼 이번엔 8진수에 대해서 배워봅시다.

앞에서 배웠듯 10진수는 각 자리를 0~9까지 나타낼 수 있고 2진수는 0~1까지 나타낼 수 있습니다.

그러므로 8진수는 0~7까지 나타낼 수 있답니다!

그럼 10진수를 8진수로 변환하는 방법을 알아봅시다.


10진수를 8진수로 변환하기 위해서는 [10진수 → 2진수 → 8진수]로 단계별 과정을 거치면 쉽게 바꿀 수 있습니다.

먼저 위에서 확인해보았던 10진수 [86]을 2진수로 변환하면 [1010110]입니다. 8진수는 2진수 자리를 3개씩 나눠 값을 변환하면 됩니다.

2진수를 맨 뒷 자리부터 3개씩 나눠봅시다.

맨 앞의 1은 앞에 2개의 값이 없습니다. 이때는 앞에 2개의 0이 있다고 생각해보세요.

그리고 각 자리의 값을 8진수로 변환하게 되면 아래와 같습니다.

2진수를 8진수로 변환하면 [126]이 됩니다.

▶ 10진수 → 8진수 변환 퀴즈

아래 3개의 문제를 직접 계산해보고 선생님께 확인 받으세요.

1) 213 → ?

2) 99 → ?

3) 194 → ?

4. 16진수

10진수를 16진수로 변환하는 방법을 알아봅시다.

16진수는 각 자리를 0~15로 표현할 수 있습니다.

10진수를 16진수로 변환하기 위해서는 [10진수 → 2진수 → 16진수]로 단계별 과정을 거치면 쉽게 바꿀 수 있습니다.


먼저 위에서 확인해보았던 10진수 [86]을 2진수로 변환하면 [1010110]입니다. 16진수는 2진수 자리를 4개씩 나눠 값을 변환하면 됩니다.

10진수 [86]을 16진수로 변환하면 [56]입니다.


만약, 10진수 [214]를 16진수로 변환하면 어떤 값이 나올까요?

먼저 앞에서 배웠던 것을 이용해 10진수 [214]를 2진수로 변환하면 [11010110]라는 값이 나옵니다.

2진수 값을 4개씩 나눠 16진수로 변환해봅시다.


4개씩 나눠 값을 변환하게되면 13, 6이라는 값이 나옵니다.

그럼 10진수 [214]를 16진수로 변환한 결과는 [136]일까요?

절대 아닙니다!

값이 13/6을 나타낸 것인지 1/3/6을 나타낸 것인지 알 수 없습니다.

16진수에서는 10~15까지의 값은 A~F까지의 알파벳으로 나타냅니다.

10진수 16진수
10 A
11 B
12 C
13 D
14 E
15 F

따라서 10진수 [214]를 16진수로 표현하면 [D6]이 됩니다.

▶ 10진수 → 16진수 변환 퀴즈

아래 3개의 문제를 직접 계산해보고 선생님께 확인 받으세요.

1) 235 → ?

2) 106 → ?

3) 192 → ?


5. 비트연산자

비트연산자 설명
& AND
| OR
^ XOR
<< LEFT SHIFT
>> RIGHT SHIFT
&, |, ^
연산자 비트 값1 비트 값2 결과
& 1 1 1
1 0 0
0 1 0
0 0 0
| 1 1 1
1 0 1
0 1 1
0 0 0
^ 1 1 0
1 0 1
0 1 1
0 0 0


<<, >>
연산자 코드 결과 설명
<< 101 << 2 10100 비트를 왼쪽으로 N번 이동

(0을 뒤에 N개 추가함)

1100 << 3 1100000
11 << 1 110
>> 101 >> 2 1 비트를 오른쪽으로 N번 이동

(맨 뒤 값 N개를 삭제함)

1101 >> 1 110
1100 >> 3 1

헷갈린다면 <, > 모양에 따라 화살표를 그려보세요!

화살표 방향으로 비트를 이동시키면 쉬워요!

▶ 비트 연산 퀴즈

아래 문제를 직접 계산해보고 선생님께 확인 받으세요.

아래 퀴즈의 결과를 10진수로 나타내보세요.

1) 86 & 55 → ?

2) 86 | 55 → ?

3) 86 ^ 55 → ?

4) 45 << 2 → ?

5) 95 >> 3 → ?


모듈

1. struct

C/C++ 구조를 파이썬에서 사용할 수 있도록 데이터 변환할 때 사용하는 모듈.

1) pack : 원하는 값들을 특정 포맷으로 하나의 객체로 합쳐줌

2) unpack : 합쳐진 객체를 특정 포맷으로 여러 객체로 분리해줌

2. datetime

날짜와 시간을 다루는 모듈.

1) datetime 클래스 : 년, 월, 일, 시간, 분, 초, 마이크로초 등을 포함한 객체 생성

import datetime
now = datetime.datetime.now()
print(now)

# 출력 결과 
# 2024-09-14 01:55:57.531073

2) strptime : 문자열을 datetime 객체로 변환

import datetime
s = "2024-09-14 11:20:45"
date = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
print(date)

# 출력 결과 
# 2024-09-14 11:20:45

3) strftime : datetime 객체를 지정한 포맷에 맞게 문자열로 변환

import datetime
now = datetime.datetime.now()
date1 = now.strftime("%Y년 %m월 %d일 %H:%M:%S")
print(date1)
# 출력 결과 
# 2024년 09월 14일 02:08:51

date2 = now.strftime("%m월 %d일 !! ")
print(date2)
# 출력 결과 
# 09월 14일 !! 

date3 = now.strftime("%Y.%m.%d. %H시 %M분 %S초")
print(date3)
# 출력 결과 
# 2024.09.14. 02시 10분 29초


4) 포맷

포맷코드 설명
%a 요일 줄임말 Sun, Mon, ..., Sat
%A 요일 Sunday, Monday, ..., Saturday
%w 요일을 숫자로 표시 (일요일:0, 월요일:1, ..., 토요일:6) 0, 1, ..., 6
%d 01, 02, ..., 31
%b 월 줄임말 Jan, Feb, ..., Dec
%B January, February, ..., December
%m 숫자 월 01, 02, ..., 12
%y 두 자릿수 연도 01, 02, ..., 99
%Y 네 자릿수 연도 0001, 0002, ..., 2023, 2024, ..., 9999
%H 시간(24시간) 00, 01, ..., 23
%I 시간(12시간) 01, 02, ..., 12
%p AM, PM AM, PM
%M 00, 01, ..., 59
%S 00, 01, ..., 59
%Z 시간대 대학민국 표준시 (비어 있음), UTC, EST, CST
%j 1월 1일부터 경과한 일수 001, 002, ..., 366
%U 1년중 주차, 일요일이 한 주의 시작으로 00, 01, ..., 53
%W 1년중 주차, 월요일중 주차, 월요일 00, 01, ..., 53
%c 날짜, 요일, 시간을 출력, 현재 시간대 기준 Sat Sep 14 02:19:16 2024
%x 날짜를 출력, 현재 시간대 기준 09/14/24
%X 시간을 출력, 현재 시간대 기준 02:20:13

3. calendar

1) calendar : 입력한 년도의 달력을 출력

import calendar
print(calendar.calendar(2024))

[출력 결과]

2) month : 입력한 년도의 원하는 월 출력

import calendar
print(calendar.month(2024, 10))

[출력 결과]

4. math

1) round : 지정한 소수점 자릿수에 맞춰 반올림하는 함수

import math
a=7.147
print(round(a))
print(round(a,-1))
print(round(a,1))
print(round(a,2))
print(round(a,3))
print(round(a,4))

# 출력 결과
# 7
# 10.0
# 7.1
# 7.15
# 7.147
# 7.147

2) ceil : 실수를 올림하여 정수로 반환

import math
a=7.147
print(math.ceil(a))
b=3.7
print(math.ceil(b))

# 출력 결과
# 8
# 4

3) floor : 실수를 내림하여 정수로 반환

import math
a=7.147
print(math.floor(a))
b=3.7
print(math.floor(b))

# 출력 결과
# 7
# 3

4) factorial : 1~N까지 곱한 값 반환 (N! : 팩토리얼)

import math
a=5
print(math.factorial(a))
b=3
print(math.factorial(b))

# 출력 결과
# 120
# 6

5) gnd(a, b) : a와 b의 최대공약수 반환

import math
a = 20
b = 24
print(math.gcd(a,b))

# 출력 결과
# 4

6) sqrt : 제곱근 반환

import math
a = 4
b = 121
c = 25
print(math.sqrt(a))
print(math.sqrt(b))
print(math.sqrt(c))

# 출력 결과
# 2.0
# 11.0
# 5.0

7) pow(a, b) : a의 b제곱 값 반환

import math
print(math.pow(2,3))
print(math.pow(2,5))
print(math.pow(3,2))

# 출력 결과
# 8.0
# 32.0
# 9.0

5. random

1) random : 0 이상 1 미만의 무작위 값 반환

import random
print(random.random())
print(random.random())
print(random.random())
print(random.random())
print(random.random())

# 출력 결과
# 0.789151304563551
# 0.377096725708465
# 0.4463789421422576
# 0.03214667403259963
# 0.704154756663026

2) randint(a, b) : a 이상 b 이하의 정수 중 무작위 값 반환

import random
print(random.randint(1,5))
print(random.randint(1,5))
print(random.randint(1,5))
print(random.randint(1,5))
print(random.randint(1,5))

# 출력 결과
# 1
# 3
# 5
# 3
# 5

3) choice : 무작위 원소를 뽑아 반환

import random
arr = [10, 2, 56, 3, 99]
print(random.choice(arr))
print(random.choice(arr))
print(random.choice(arr))

# 출력 결과
# 3
# 10
# 99

4) shuffle : 요소를 무작위로 섞어 반환

import random
arr = [10, 2, 56, 3, 99]
random.shuffle(arr)
print(arr)
random.shuffle(arr)
print(arr)

# 출력 결과
# [99, 10, 3, 56, 2]
# [10, 56, 99, 3, 2]

5) sample : 지정한 개수만큼 임의로 요소를 선택하여 반환

import random
arr = [10, 2, 56, 3, 99]
print(random.sample(arr, 2))
print(random.sample(arr, 3))

# 출력 결과
# [10, 56]
# [56, 99, 2]

6. pickle

파이썬에서 사용하는 다양한 자료를 객체 그대로 파일로 저장하고 이를 불러올 때 사용하는 모듈.

7. os

1) mkdir : 새로운 디렉토리 생성

2) getpid : 현재 프로세스 ID를 반환

3) setregid : 현재 프로세스의 그룹 ID를 설정

4) read : 파일 읽기

5) chdir : 디렉토리의 위치 변경

6) getcwd : 현재 작업 중인 파일의 경로 반환

7) listdir : 해당 경로에 위치하는 파일과 디렉토리 반환

8) removedirs : 해당 경로의 디렉토리 삭제

9) rename : 파일 이름 변경

8. traceback

1) format : 오류가 발생한 위치의 추석 결과를 반환

9. re

정규표현식을 사용할 수 있는 모듈

정규표현식 설명 예제
. 임의의 문자 하나 a.c : a와 c 사이 임의의 문자가 있음. (abc, adc ..)
? 해당 패턴의 앞에 문자가 하나 있거나 없는 경우 \d? : 숫자가 하나 있거나 없어야 함
^ 이 패턴으로 시작해야 함 ^coders : coders로 시작해야 함(coders!, coders123 .. )
+ 앞 패턴이 하나 이상 \d+coders : coders 앞에 숫자가 하나 이상
* 앞 패턴이 0개 이상 \d*coders : coders 앞에 숫자가 0개 이상
[문자열] [문자열]에 있는 문자가 포함된 문자여야 함. ["CcOoders"] : Coders, COd
[^문자열] [문자열]과 반대로 피해야할 문자열의 집합. [^문자열]에 있는 문자열을 제외한 문자여야 함. ["^ABC"] : coders, Python
| 두 패턴 중 하나여야 함 a | b : a 또는 b 이어야 함
{n} 앞 패턴을 n번 반복 \d{5} : 숫자가 5개 있어야함
{n,m} 앞 패턴이 n 이상 m 이하로 반복 \d{1,3} : 숫자가 1개 이상 3개 이하로 있어야 함
$ 이 패턴으로 종료되야 함. coders$ : coders로 종료되어야 함 (abc!coders, 2024coders)
\d 숫자 0~9 \d : 0~9 숫자
\w 숫자나 알파벳(문자를 의미) \w : 문자 1개 (a, b, 1 .. )
\n 줄 바꿈 엔터

1) compile : 정규표현식 패턴을 정하는 함수

2) match : 문자열의 처음이 정규표현식과 매치되는지 확인 (접두사가 패턴과 일치하는지 판단)

3) fullmatch : 문자열 전체가 해당 패턴인지 확인

import re
pattern = re.compile('o[gh]')
print(pattern.match('oh'))
print(pattern.fullmatch('oh'))
# 출력 결과
# <re.Match object; span=(0, 2), match='oh'>
# <re.Match object; span=(0, 2), match='oh'>

print(pattern.match('oha'))
print(pattern.fullmatch('oha'))
# 출력 결과
# <re.Match object; span=(0, 2), match='oh'>
# None
import re
pattern = re.compile('...[abc]*')
print(pattern.match('321ca'))
print(pattern.fullmatch('321ca'))
# 출력 결과
# <re.Match object; span=(0, 5), match='321ca'>
# <re.Match object; span=(0, 5), match='321ca'>

print(pattern.match('321coders'))
print(pattern.fullmatch('321coders'))
# 출력 결과
# <re.Match object; span=(0, 4), match='321c'>
# None