Algorithm101

SW 문제 해결 역량이란?

: 프로그램 작성을 위한 많은 제약 조건들과 요구사항들을 이해하고 최선의 방법을 찾아내는 능력

  • 프로그래머가 사용하는 언어, 라이브러리, 자료구조, 알고리즘에 대한 지식을 적재적소에 연결하여 큰 그림을 만드는 능력

알고리즘의 효율

1. 공간적 효율성과 시간적 효율성

  • 공간적 효율성은 얼마나 많은 메모리 공간을 요하는가를 말함

  • 시간적 효율성은 얼마나 많은 시간을 요하는가를 말함

  • 효율성을 뒤집어 표현하면 복잡도 (Complexity) 가 된다

    • 복잡도가 높을수록 효율성은 저하된다

2. 시간적 복잡도 분석

  • 하드웨어 환경에 따라 처리시간이 달라진다

  • 소프트웨어 환경에 따라 처리시간이 달라진다

  • 그래서, 화이러한 환경적 차이로 인해 분석이 어렵다

3. 복잡도의 점근적 표기

  • 시간 (또는 공간) 복잡도는 입력 크기에 대한 함수로 표기하는데, 이 함수는 주로 여러갷의 항을 가지는 다항식이다

O (Big-Oh) 표기

1. 정의

  • T(n): 실행시간

  • T(n) <= c*f(n)이 되는 상수 c, n0가 존재할 때만 T(n) = O(f(n))이라고 한다

  • 단, 상수 c와 초기값 n0는 n의 값에 독립적이다

2. 표기

  • O-표기

    • 복잡도의 점근적 상한을 나타낸다

    • 복잡도가 T(n) = 2n^2 - 7n +4 이라면, T(n)의 O 표기는 O(n^2) 이다

    • T(n)의 단순화된 표현은 n^2이다

    • "최악의 경우에도 이만큼은 나온다"

  • Big-Omega 표기

    • 복잡도의 점근적 하한을 의미한다

    • "최소한 이만큼은 걸린다"

Omega < Theta < Big O

자주 사용하는 O-표기

  • O(1)

    • 상수 시간 (Constant time)

  • O(logn)

    • 로그(대수) 시간 (Logarithmic time)

  • O(n)

    • 선형 시간 (LInear time)

  • O(nlogn)

    • 로그 선형 시간 (Log-linear time)

  • O(n^2)

    • 제곱 시간 (Quadratic time)

  • O(n^3)

    • 세제곱 시간 (Cubic time)

  • O(2^n)

    • 지수 시간 (Exponential time)

비트 연산

비트 연산자

  • 정수는 2byte로, 혹은 4byte로 표기하기도 한다

  • 범위를 넘어 갈 때

    • 없애버리거나

    • 보정을 해준다

  • 정수는 부호 비트가 가장 앞에 들어간다

N & 1

  • 변수에 저장된 양의 정수 값의 홀수 짝수 판별

    • N%2

  • % 연산으로 마지막 비트 값이 1인지 0인지 판단, 짝수 홀수 판별

1 << n

  • 2^n의 값을 갖는다

  • 원소가 n개일 경우의 모든 부분집합의 수를 의미한다

  • Power set (모든 부분 집합)

    • 공집합과 자기 자신을 포함한 모든 부분집합

    • 각 원소가 포함되거나 포함되지 않는 2가지 경우의 수를 계싼하면 모든 부분집합의 수가 계산된다

i & (1 << j) = (i >> j) &1

  • 계산 결과는 i의 j번째 비트가 1인지 아닌지를 의미한다

비트 연산자 ^를 두 번 연산하면 처음 값을 반환한다

비트 연산 예제 1

def Bbit_print(i):
    output = ''
    for j in range(7, -1, -1):
        output += "1" if i&(1<<j) else "0"
    print(output)

for i in range(-5, 6):
    print("%3d = " %i, end='')
    Bbit_print(i)

엔디안 (Endianness)

  • 컴퓨터의 메모리와 같은 1차원 공간에 여러 개의 연속된 대상을 배열하는 방법을 의미하며 HW 아키텍처마다 다르다

  • 주의!

    • 속도 향상을 위해 바이트 단위와 워드 단위를 변환하여 연산 할 때 올바로 이해하지 않으면 오류를 발생 시킬 수 있다

빅 엔디안 (Big-endian)

  • 보통 큰 단위가 앞에 나옴

  • 네트워크

    • ex) internet protocol, IBM z/architecture (대형 컴퓨터 일부만..)

리틀 엔디안 (Little-endian)

  • 작은 단위가 앞에 옴

  • 대다수 데스크탑 컴퓨터

    • ex) Intel, ARM processor

엔디안 확인 코드

# ver1)
n = 0x00111111
if n&0xff: #0xff = 11111111 이다!
    print("little endian")
else:
    print("big endian")

print('-'*20)

#ver2) python sys library 활용
import sys
if sys.byteorder == "little":
    print("Little endian platform")
else:
    print("Big endian platform")

Python 에서 엔디안 변환

# Python에서 Endian 변환

import struct #c의 library

num = 27
print(bin(num))
res = struct.pack('i', num)
print('default :', res)

res = struct.pack('> i', num)
print('big endian :', res)

res = struct.pack('< i', num)
print('little endian :', res)

res = struct.pack('! i', num)
print('network :', res)
print('unpack :', struct.unpack('!i',res))

진수

2진수, 8진수, 10진수, 16진수

10진수 -> 타 진수로 변환

  • 원하는 타 진법의 수로 나눈 뒤 나머지를 거꾸로 읽는다

컴퓨터에서 음의 정수 표현 방법

  • 1의 보수

    • 부호와 절대값으로 표현된 값을 부호 비트를 제외 한 나머지 비트들을 0은 1로, 1은 0으로 변환

  • 2의 보수

    • 1의 보수방법으로 표현된 값의 최하위 비트에 1을 더한다

실수

실수의 표현

  • 컴퓨터는 실수를 표현하기 위해 부동 소수점(floating-point) 표기법을 사용한다

  • 부동 소수점 표기 방법은 소수점의 위치를 고정시켜 표현하는 방식이다

    • 소수점의 위치를 왼쪼그이 가장 유효한 숫자 다음으로 고정시키고 밑수의 지수승으로 표현

      • ex) 10001.0011 -> 1.0010011x 2^3

실수를 저장하기 위한 형식

  • 단정도 실수 (32비트)

    • float

      부호 1비트 | 지수 8비트 | 가수 23비트
  • 배정도 실수 (64비트)

    • double

      • python은 float이라고 표현함

      부호 1비트 | 지수 11비트 | 가수 52비트

컴퓨터는 신수를 근사적으로 표현한다

  • 이진법으로 표현 할 수 없는 형태의 실수는 정확한 값이 아니라 근사 값으로 저장되는데, 이때 생기는 작은 오차가 계산 과정에서 다른 결과를 가져온다

실수 자료형의 유효 자릿수

  • 32 비트 실수형 유효 자릿수 (10진수 기준) -> 6

  • 64 비트 실수형 유효 자릿수 (10진수 기준) -> 15

파이썬의 숫자 자료형

숫자형 (Number)

  • 숫자형(Number)이란 숫자 형태로 이루어진 자료형

항목사용 예

정수

123, -345, 0

실수

123.45, -1234.5, 3.4e10

8진수

0o34, 0o25

16진수

0x2A, 0xFF

정수형

  • 정수형(Integer)이란 말 그대로 정수를 뜻하는 자료형을 말한다.

  • ex) 양의 정수와 음의 정수, 숫자 0을 변수 a에 대입하는 예

>>> a = 123
>>> a = -178
>>> a = 0

실수형

  • 파이썬에서 실수형(Floating-point)은 소수점이 포함된 숫자를 말한다.

  • ex) 실수를 변수 a에 대입하는 예

일반적으로 볼 수 있는 실수형의 소수점 표현 방식

>>> a = 1.2
>>> a = -3.45

"컴퓨터식 지수 표현 방식"

  • 파이썬에서는 4.24e10 또는 4.24E10처럼 표현한다

>>> a = 4.24E10
>>> a = 4.24e-10
  • e와 E 둘 중 어느 것을 사용해도 무방

  • 여기서 4.24E10은 4.24∗10104.24∗1010, 4.24e-10은 4.24∗10−104.24∗10−10을 의미함

8진수와 16진수

  • 8진수(Octal)를 만들기 위해서는 숫자가 0o 또는 0O(숫자 0 + 알파벳 소문자 o 또는 대문자 O)로 시작하면 된다.

>>> a = 0o177
  • 16진수(Hexadecimal)를 만들기 위해서는 0x로 시작하면 된다.

>>> a = 0x8ff
>>> b = 0xABC

Last updated