본문 바로가기

Python/자료구조 (Data Structure)

1. 숫자 (Number): 파이썬 자료구조와 알고리즘

https://github.com/beomseok-kang/DSA-examples 에서 예제에 대한 내 답을 볼 수 있다.

 

 

인간에게는 10개의 손가락을 바탕으로 시작했던 10진법 (decimal) 이 가장 익숙하다. 그러나 컴퓨터는 전자상태의 신호인 참/거짓 (1과 0)을 사용한 이진법 (binary) 이 더 적합하다. 따라서 이를 통해 컴퓨터는 정보를 비트 (bit) 로 표현한다. bit가 8개 모이면 byte, byte가 2^10개 모이면 kilobyte 등등...

 

숫자는 세가지 형태로 나타날 수 있다. 정수 (integer), 부동소수점 (float), 그리고 복소수 (complex) 로 나타낼 수 있다.

 

파이썬에서 불변형 객체 (immutable object) 란 변수와 객체 참조 간제 차이가 없는 객체이다.

 

정수

 

파이썬에서 정수는 int 로 나타내며 불변형이다. 파이썬의 정수 크기는 적어도 32비트이다. 어떤 문자열을 정수로 전환하거나, 다른 진법의 문자열을 정수로 변환하려면 int(문자열, 진법) 메서드를 사용한다.

 

>>> s = '11'
>>> a = int(s,2)
>>> a
3

 

int 메서드는 두번 째 인수 (argument) 를 선택적 (optional) 으로 넣을 수 있다. 이 인수의 기본값은 10 (10진법) 이다.

 

부동소수점

 

파이썬에서 부동소수점은 float 로 나타내며 불변형이다. 단정도 (single precision) 방식에서 32비트 부동소수점을 타나낼 때, 1비트는 부호 (0은 양수, 1은 음수), 8비트는 지수 (exponent), 23비트는 유효숫자 자릿수 (significant digits) 이다.

 

더보기

예를 들어, 십진수 -118.625를 32비트 단정도로 표현해보자.

 

먼저 가장 첫번 째 비트는 1 (음수) 이다. 그 다음, 숫자의 절댓값을 이진수로 변환한다.

헷갈리면 https://ko.wikihow.com/%EC%8B%AD%EC%A7%84%EC%88%98%EB%A5%BC-%EC%9D%B4%EC%A7%84%EC%88%98%EB%A1%9C-%EB%B0%94%EA%BE%B8%EB%8A%94-%EB%B2%95 여기를 참조하자.

 

118 / 2 = 59 ... 0

59 / 2 = 29 ... 1

29 / 2 = 14 ... 1

14 / 2 = 7 ... 0

7 / 2 = 3 ... 1

3 / 2 = 1 ... 1

0.625 * 2 = 1 ... 0.25

0.25 * 2 = 0 ... 0.5

0.5 * 2 = 1

 

따라서, 1110110.101 (2) 이다.

그 다음, 변환된 이진수를 정규화 한다.

1110110.101 (2) = 1.110110101 * 2^6 (2)

 

위 숫자를 가수부 (23비트) 에 넣는다. 부족한 자릿수는 0으로 채운다.

11011010100000000000000

 

지수는 6이므로, 바이어스 (bias) 를 더한다. 지수 6에 127을 더한다.

 

6 + 127 = 133 = 10000101 (2)

 

종합하여, -118.625를 단정도로 표현한 결과는

 

11000010111011010100000000000000

부호 지수           기수

 

이다.

배정도 (double precision) 방식에서는 64비트 부동소수점을 나타낼 때 1비트는 부호, 11비트는 지수, 52비트는 가수로 나타내며, 단정도 방식일 때는 127을 더하고, 배정도 방식일 때는 1023을 더한다.

 

부동소수점은 이진수 분수 (binary fraction) 로 표현되기 때문에 함부로 비교하거나 빼면 안된다. 예를 들어 10진수의 0.1은, 2진법으로 표현하면 0.01100110011... 이다 (순환소수). 따라서 

>>> 0.1 == 1.1 - 1.0
False

이런 결과가 나온다. 따라서 동등성 테스트 (equality test) 는 사전에 정의된 정밀도 범위 내에서 수행되어야 한다. 예를 들어, unittest 모듈의 assertAlmostEqual() 메서드 같은 접근법이 있다.

 

정수와 부동소수점 메서드

 

파이썬에서 나누기 연산자는 ( / ) 부동소수점을 반환한다. // 연산자를 사용하면 정수부를 반환할 수 있다 (floor, 또는 trucation). % 연산자 (module 또는 remainder) 를 사용하면 나머지를 반환한다. divmod(x, y) 메서드는 x를 y로 나눌 때의 몫과 나머지를 반환한다.

 

round(x, n) 메서드는 x를 소수점 밑 n의 자릿수에서 반올림한 값을 반환한다. n은 양수가 기본이지만 음수도 지원한다. 음수를 사용하면 소수점 위에서 반올림한 값을 반환한다.

>>> round(118.81, 1)
118.8
>>> round(118.81, -1)
120.0

as_integer_ratio() 메서드는 부동소수점을 분수로 표현하는 것을 반환한다.

>>> 1.75.as_integer_ratio()
(7, 4)

 

복소수

 

복소수 또한 불변형이다. 파이썬에서 복소수는 부동소수점 한 쌍을 갖는 객체이다. z.real, z.imag, z.conjugate() 같은 메서드로 실수부 (real), 허수부 (imaginary), 켤레 복소수 (conjugate pair) 를 구할 수 있다.

 

복소수를 사용하기 위해선 cmath 모듈을 임포트 해야한다.

 

fraction, decimal 모듈

 

파이썬에서 분수를 다루려면 fraction 모듈을 사용하고, 정확한 10진법의 부동소수점 숫자가 필요한 경우, decimal 모듈을 사용한다. decimal.Decimal을 사용하면 부동소수점의 반올림, 비교, 뺄셈 등에서 나타나는 문제를 효율적으로 처리할 수 있다.

>>> sum(0.1 for i in range(10)) == 1.0
False
>>> from decimal import Decimal
>>> sum(Decimal("0.1") for i in range(10)) == Decimal("1.0")
True

 

2진수, 8진수, 16진수

 

bin(i), oct(i), hex(i) 메서드는 각각 해당하는 정수 i 의 2진수, 8진수, 16진수 문자열을 반환한다.

 

넘파이 (NumPy) 패키지

 

넘파이는 파이썬의 확장 패키지이며, 대규모의 다차원 배열 및 행렬을 지원한다. 또한 배열 연산에 쓰이는 수학 함수 라이브러리를 제공한다. 넘파이 배열은 임의의 차원 (dimension) 을 가진다. 넘파이 모듈의 array 메서드로 시퀀스의 시퀀스를 2차원 넘파이 배열로 생성할 수 있다.

 

연습문제

더보기

연습 해보자.

1. 진법 변환 함수

2. 최대 공약수

3. 피보나치 수열의 n번째 항

4. 소수 판별

 

출처

https://ko.wikihow.com/%EC%8B%AD%EC%A7%84%EC%88%98%EB%A5%BC-%EC%9D%B4%EC%A7%84%EC%88%98%EB%A1%9C-%EB%B0%94%EA%BE%B8%EB%8A%94-%EB%B2%95

파이썬 자료구조와 알고리즘 - 미아 스타인, 한빛미디어