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