코딩 테스트 해결 방법론 플로우차트

DEV/Algorithm

코딩 테스트 해결 방법론 플로우차트

BI3A 2026. 3. 29. 22:55

반응형
flowchart TD
    START([문제]) --> Q1

    Q1{"노드/칸 사이를\n이동하는 문제?\nex) 미로, 지도, 네트워크"}
    Q1 -->|YES| Q1a{"최단 거리/비용\n을 구해야 함?"}
    Q1 -->|NO| Q2

    Q1a -->|YES| Q1b{"간선마다\n비용이 다름?\nex) 도로마다 거리 다름"}
    Q1a -->|NO| Q1c{"가능한 모든 경로/조합\n을 탐색해야 함?\nex) 모든 순열, N-Queen"}

    Q1b -->|YES| DIJKSTRA
    Q1b -->|NO| BFS

    Q1c -->|YES| DFS
    Q1c -->|NO| BFS_DFS(["BFS or DFS\n연결 확인, 영역 탐색"])

    Q2{"정렬된 배열에서\n값/경계를 찾아야 함?\nex) 이 값이 있나?\n최소 X 이상인 첫 위치는?"}
    Q2 -->|YES| BINARY
    Q2 -->|NO| Q3

    Q3{"최적값(최대/최소)을\n구해야 함?"}
    Q3 -->|YES| Q3a{"부분 결과가 반복적으로 겹침?\n= 같은 계산을 여러 번 하게 됨\nex) f(n) = f(n-1) + f(n-2)"}
    Q3 -->|NO| UNKNOWN([문제 재검토 / 유형 불명확])

    Q3a -->|YES| Q_DP1
    Q3a -->|NO| Q3b{"매 순간 가장 좋은 것만\n골라도 전체 최적?\nex) 동전 거스름돈, 회의실 배정\n반례가 없음을 증명 가능?"}

    Q3b -->|YES| GREEDY
    Q3b -->|NO| UNKNOWN

    Q_DP1{"무게/용량/합 제한 안에서\n최대 가치/최소 비용?\nex) 배낭에 물건 담기"}
    Q_DP1 -->|YES| KNAPSACK
    Q_DP1 -->|NO| Q_DP2

    Q_DP2{"수열에서 순서 유지하며\n가장 긴 증가/감소 부분?\nex) 탑 쌓기, 가장 긴 증가 수열"}
    Q_DP2 -->|YES| LIS_NODE
    Q_DP2 -->|NO| Q_DP3

    Q_DP3{"두 문자열/수열의\n공통 부분 최장 길이?\nex) 두 문자열의 공통 부분"}
    Q_DP3 -->|YES| LCS_NODE
    Q_DP3 -->|NO| Q_DP4

    Q_DP4{"작은 구간 결과로\n큰 구간 결과를 계산?\nex) 행렬 곱셈 순서, 괄호 묶기"}
    Q_DP4 -->|YES| INTERVAL_DP
    Q_DP4 -->|NO| OTHER_DP

    BFS["BFS
    ──────────────
    시간복잡도: O(V+E)
    자료구조: Queue
    ──────────────
    방법: 레벨 단위 탐색
    방문 배열로 중복 차단
    ──────────────
    dist[next] = dist[cur] + 1
    ──────────────
    백준 2178 미로 탐색"]

    DIJKSTRA["다익스트라
    ──────────────
    시간복잡도: O((V+E) log V)
    자료구조: PriorityQueue
    ──────────────
    방법: 최소 비용 노드부터 확정
    ──────────────
    dist[next] = min(dist[next],
                 dist[cur] + weight)
    ──────────────
    백준 1753 최단경로"]

    DFS["DFS / 백트래킹
    ──────────────
    시간복잡도: O(V+E) / O(N!)
    자료구조: Stack / 재귀
    ──────────────
    방법: 깊이 우선 탐색
    조건 불만족 시 가지치기
    ──────────────
    백준 9663 N-Queen"]

    BINARY["이분탐색
    ──────────────
    시간복잡도: O(log N)
    자료구조: 정렬 배열
    ──────────────
    방법: mid 기준으로 lo/hi 이동
    ──────────────
    while lo <= hi:
      mid = (lo+hi)/2
      if arr[mid] < target: lo=mid+1
      else: hi=mid-1
    ──────────────
    백준 1920 수 찾기"]

    GREEDY["그리디
    ──────────────
    시간복잡도: O(N log N)
    자료구조: 정렬 배열 / PQ
    ──────────────
    방법: 정렬 후
    매 순간 최선 선택
    ──────────────
    백준 11047 동전 0"]

    KNAPSACK["DP - 냅색
    ──────────────
    시간복잡도: O(N x W)
    자료구조: 1D/2D 배열
    ──────────────
    방법: 아이템 순회 x 용량 순회
    ──────────────
    dp[j] = max(dp[j],
            dp[j-w] + v)
    ──────────────
    백준 12865 평범한 배낭"]

    LIS_NODE["DP - LIS
    ──────────────
    시간복잡도: O(N²) / O(N log N)
    자료구조: 1D 배열
    ──────────────
    방법: 정렬 후 이전 원소와
    대소 비교하며 갱신
    ──────────────
    dp[i] = max(dp[j] + val[i])
    if val[j] < val[i]
    ──────────────
    백준 2655 가장 높은 탑 쌓기"]

    LCS_NODE["DP - LCS
    ──────────────
    시간복잡도: O(N x M)
    자료구조: 2D 배열
    ──────────────
    방법: 두 수열 동시 순회
    ──────────────
    if A[i]==B[j]:
      dp[i][j] = dp[i-1][j-1]+1
    else:
      dp[i][j] = max(dp[i-1][j],
                 dp[i][j-1])
    ──────────────
    백준 9251 LCS"]

    INTERVAL_DP["DP - 구간 DP
    ──────────────
    시간복잡도: O(N³)
    자료구조: 2D 배열
    ──────────────
    방법: 구간 길이를
    점점 늘려가며 계산
    ──────────────
    for len 2→n:
      for i:
        j = i+len
        dp[i][j] = min/max(...)
    ──────────────
    백준 11049 행렬 곱셈 순서"]

    OTHER_DP["DP - 기타
    ──────────────
    트리 DP: O(N)
    비트마스크 DP: O(N x 2^N)
    ──────────────
    백준 2533 사회망 서비스
    백준 2098 외판원 순회"]

상세 설명

BFS (너비 우선 탐색)


다익스트라

  • 시간복잡도: O((V+E) log V)
  • 자료구조: PriorityQueue (최소 힙)
  • 사용 조건: 가중치 있는 그래프에서 단일 출발 최단 거리
  • 핵심 점화식
    dist[next] = min(dist[next], dist[cur] + weight)
  • 예제 문제

DFS / 백트래킹

  • 시간복잡도: O(V+E) 탐색 / O(N!) 백트래킹 최악
  • 자료구조: 재귀 스택
  • 사용 조건: 모든 경우의 수 탐색, 조합/순열, 조건 만족 여부
  • 핵심 구조
    void dfs(상태) {
        if (종료 조건) { 결과 처리; return; }
        for (다음 선택지) {
            if (가지치기 조건) continue;
            dfs(다음 상태);
        }
    }
  • 예제 문제

이분탐색

  • 시간복잡도: O(log N)
  • 자료구조: 정렬된 배열
  • 사용 조건: 정렬된 배열에서 값 탐색, 파라메트릭 서치
  • 핵심 점화식
    while lo <= hi:
        mid = (lo + hi) / 2
        if arr[mid] < target: lo = mid + 1
        elif arr[mid] > target: hi = mid - 1
        else: return mid
  • 예제 문제

그리디

  • 시간복잡도: O(N log N) (정렬 포함)
  • 자료구조: 정렬 배열 / PriorityQueue
  • 사용 조건: 현재 최선 선택이 전체 최선을 보장할 때
  • 핵심 구조
    배열 정렬
    for 각 원소:
        현재 기준으로 최선 선택
  • 예제 문제

DP - 냅색 (Knapsack)

  • 시간복잡도: O(N × W)

  • 자료구조: 1D 또는 2D 배열

  • 사용 조건: 용량/합 제한 안에서 최대 가치

  • 핵심 점화식

    // 0/1 냅색 (아이템 1번만 사용)
    for i in 1..N:              // 아이템 순회
        for j in W..w[i]:       // 용량 역순 순회
            dp[j] = max(dp[j], dp[j - w[i]] + v[i])
    
    // 무한 냅색 (아이템 반복 사용)
    for i in 1..N:
        for j in w[i]..W:       // 용량 정순 순회
            dp[j] = max(dp[j], dp[j - w[i]] + v[i])
  • 예제 문제


DP - LIS (최장 증가 부분 수열)

  • 시간복잡도: O(N²) 기본 / O(N log N) 이분탐색 최적화

  • 자료구조: 1D 배열

  • 사용 조건: 원소 간 순서와 값 대소 관계가 모두 중요할 때

  • 핵심 점화식

    // O(N²)
    dp[i] = bricks[i].h  // 기저: 자기 자신
    for j in 0..i:
        if val[j] < val[i]:
            dp[i] = max(dp[i], dp[j] + val[i])
    
    // O(N log N) - tails 배열 유지
    for x in arr:
        pos = lower_bound(tails, x)
        tails[pos] = x
  • 예제 문제


DP - LCS (최장 공통 부분 수열)

  • 시간복잡도: O(N × M)
  • 자료구조: 2D 배열
  • 사용 조건: 두 수열의 공통된 부분 수열 최대 길이
  • 핵심 점화식
    if A[i] == B[j]:
        dp[i][j] = dp[i-1][j-1] + 1
    else:
        dp[i][j] = max(dp[i-1][j], dp[i][j-1])
  • 예제 문제

DP - 구간 DP

  • 시간복잡도: O(N³)
  • 자료구조: 2D 배열
  • 사용 조건: 구간 [i, j]를 점점 넓혀가며 최적값 계산
  • 핵심 점화식
    for len in 2..N:          // 구간 길이
        for i in 0..N-len:    // 시작점
            j = i + len       // 끝점
            for k in i..j:    // 분할점
                dp[i][j] = min/max(dp[i][k] + dp[k+1][j] + cost)
  • 예제 문제
반응형