수학과 데이터 구조, 그리고 알고리즘의 모든 것

수학 및 데이터 구조 기초

프로그래밍을 시작할 때 코드를 작성하는 문법만큼이나 중요한 것이 바로 데이터를 수학적으로 다루고 효율적으로 조직하는 방법을 익히는 것입니다. 본 가이드에서는 코딩의 근간이 되는 사칙연산과 변수 개념부터, 리스트·딕셔너리, 스택과 큐, 그리고 개발자를 위한 필수 수학 및 알고리즘까지 체계적으로 정리해 드립니다.

1. 기본 연산과 비교 연산

프로그래밍에서 숫자 계산과 논리적 판단은 필수적인 요소입니다.

사칙연산 및 나머지 연산 (%)

  • 기본 연산: + (더하기), - (빼기), * (곱하기), / (나누기)

  • 나머지 연산 (%): 나누고 남은 값을 반환하며, 반복 패턴이나 짝수/홀수 판별에 자주 쓰입니다.

    • 7 % 3 = 1 (3으로 나눈 나머지 1)

    • 10 % 2 = 0 (나머지가 0이면 짝수)

    • 11 % 2 = 1 (나머지가 1이면 홀수)

비교 연산 (>, <, ==, !=)

두 값을 비교하여 참(True) 또는 거짓(False) 결과를 반환합니다.

  • > (크다), < (작다), == (같다), != (같지 않다)

  • 활용 예: 로그인 시 입력한 비밀번호와 저장된 비밀번호가 같은지(==) 체크할 때 사용합니다.

2. 좌표계(X, Y)와 기본 통계 계산

2.1 좌표계 (X, Y) 이해

컴퓨터 그래픽이나 게임은 좌표로 화면을 표현합니다. 2차원 좌표 (X, Y)는 시스템에 따라 기준이 다를 수 있습니다.

  • 웹 화면 해상도 예시 (1920×1080):

    • (0, 0) = 왼쪽 위

    • (1920, 1080) = 오른쪽 아래

  • 활용 예: 캐릭터 위치 이동 시 (x, y)에서 (x+10, y)로 지정하면 오른쪽으로 10칸 이동합니다.

2.2 평균·최댓값·최솟값 계산

데이터 집합에서 가장 많이 사용하는 기본 연산입니다.

  • 평균: 합계 ÷ 개수

  • 최댓값 / 최솟값: 데이터 중 가장 큰 값과 가장 작은 값

  • 예시: 점수 [70, 80, 90, 100]인 경우 평균은 85, 최댓값은 100, 최솟값은 70이 됩니다.

3. 변수와 배열(Array), 리스트·딕셔너리 구조

변수 (Variables)

변수는 데이터가 들어있는 상자(RAM 메모리 영역에 있는 값)로 이해할 수 있습니다. 이름을 붙여 저장하고 필요할 때 꺼내 씁니다.

  • 예시: 이름 = "철수", 나이 = 20

배열과 리스트·딕셔너리

  • 배열 (Array): 같은 종류의 데이터를 순서대로 나열한 것으로, 각각의 위치를 인덱스(0부터 시작)로 접근합니다.

  • 리스트 (List): 순서가 있는 데이터 모음으로 다양한 자료형을 함께 저장할 수 있습니다. (예: ["철수", "영희", "민수"])

  • 딕셔너리 (Dictionary / Map): 키(Key)와 값(Value) 형태로 데이터를 저장하며, 순서 대신 이름표(Key)로 접근합니다. (예수: {"이름": "철수", "나이": 20})

4. 선형 자료구조: 스택(Stack)과 큐(Queue)

스택과 큐는 데이터를 순서대로 저장하고 접근하는 대표적인 선형 자료구조입니다.

스택 (Stack) – LIFO

  • 구조: 선입후출(LIFO: Last-In, First-Out) 구조로, 가장 나중에 들어온 데이터가 가장 먼저 나옵니다 (접시 쌓기와 유사).

  • 주요 연산: 데이터 추가는 Push, 제거는 Pop을 사용합니다.

  • 활용: 웹 브라우저의 ‘뒤로 가기’, 함수 호출 스택 등.

Stack 구조의 선입후출(LIFO) 방식을 나타내는 개념도

큐 (Queue) – FIFO

  • 구조: 선입선출(FIFO: First-In, First-Out) 구조로, 가장 먼저 들어온 데이터가 가장 먼저 나옵니다 (은행 창구 줄서기와 유사).

  • 주요 연산: 데이터 추가는 Enqueue(삽입), 제거는 Dequeue(삭제)를 사용합니다.

  • 활용: 운영체제의 작업 스케줄링, 인쇄 작업 대기열 등.

Queue 구조의 선입선출(FIFO) 방식을 나타내는 개념도

 

5. 개발자를 위한 필수 수학

모든 개발자에게 필요한 기본 수학

  • 논리학: 참(True)과 거짓(False)을 다루며 조건문(if, and, or, not)의 기반이 됩니다.

  • 이산수학: 셀 수 있는 유한한 대상을 다루며 컴퓨터 과학의 뼈대가 됩니다.

  • 집합론: 데이터 집합(Set), 교집합, 합집합 등을 이해하는 데 필수적입니다.

  • 그래프 이론: 소셜 네트워크나 길 찾기 알고리즘 등 데이터 간의 연결을 모델링합니다.

  • 조합론 및 대수학: 경우의 수 계산, 알고리즘 복잡도 분석, 변수와 함수 다루기에 쓰입니다.

특정 분야에 필요한 고급 수학

  • 인공지능(AI) & 머신러닝: 선형대수학(행렬과 벡터), 통계학 및 확률론, 미적분학(경사 하강법 최적화).

  • 게임 개발 & 컴퓨터 그래픽스: 기하학(3D 모델링), 선형대수학(좌표 변환), 삼각함수(물체의 자연스러운 움직임).

  • 보안 & 암호학: 정수론(공개 키 암호화 방식 RSA 등).

6. 알고리즘의 개념과 파이썬 예시 코드

알고리즘은 특정 문제를 해결하기 위한 일련의 명확하고 단계적인 절차나 규칙입니다.

알고리즘의 5대 구성 요소

  1. 입력 (Input): 문제를 해결하기 위해 받는 데이터.

  2. 출력 (Output): 데이터를 처리한 후의 결과.

  3. 명확성 (Definiteness): 각 단계가 모호하지 않아야 함.

  4. 유한성 (Finiteness): 반드시 유한한 시간 내에 끝나야 함.

  5. 효율성 (Efficiency): 더 빠르고 자원을 적게 사용할수록 좋은 알고리즘임.

주요 알고리즘 유형

  • 정렬 (Sorting): 데이터를 순서대로 배열 (예: 버블 정렬, 퀵 정렬)

  • 탐색 (Searching): 특정 데이터를 찾음 (예: 이진 탐색, 선형 탐색)

  • 그래프 (Graph): 최단 경로 탐색 (예: 다익스트라, 너비 우선 탐색)

파이썬 선형 탐색(Linear Search) 구현 예시

리스트의 처음부터 끝까지 순차적으로 요소를 확인하여 목표 값을 찾는 가장 기본적인 탐색 알고리즘입니다.

def linear_search(arr, target):
    """
    주어진 리스트(arr)에서 목표 값(target)을 찾는 선형 탐색 알고리즘
    """
    for i in range(len(arr)):
        if arr[i] == target:
            return i  # 목표 값을 찾으면 해당 인덱스 반환
    return -1  # 목표 값을 찾지 못하면 -1 반환

# 예제 사용
my_list = [2, 5, 8, 12, 16, 23, 38, 56, 72]
target_value = 23
result = linear_search(my_list, target_value)

if result != -1:
    print(f"목표 값 {target_value}는 인덱스 {result}에 있습니다.")
else:
    print(f"목표 값 {target_value}를 찾을 수 없습니다.")