1. 해시 테이블

  • 키워드:
    • "중복 제거", "빠른 탐색", "Key-Value 매핑", "주어진 값을 빠르게 찾기"
    • "빈도 계산", "사전(dictionary) 구조", "해시맵", "특정 조건 만족 여부 확인"
  • 예시 문제:
    • 배열에서 중복되는 숫자 제거.
    • 문자열에서 가장 많이 등장한 문자 구하기.
    • 두 개의 배열이 같은 원소를 포함하는지 확인.
    • 특정 합을 가지는 두 숫자의 인덱스를 찾기 (Two Sum).
    • 주어진 문자열의 아나그램을 찾기.
    • 주어진 패턴을 만족하는 문자열 매칭.

2. 스택, 큐

  • 키워드:
    • "후입선출 (LIFO)", "전입선출 (FIFO)"
    • "괄호 짝 맞추기", "스케줄 처리", "순서대로 처리", "백트래킹"
  • 예시 문제:
    • 괄호의 유요성을 탐색
    • 히스토리를 관리하는 웹 브라우저의 뒤로 가기/앞으로 가기 구현.
    • 큐를 사용한 프로세스 스케줄링 문제.
    • 중위 표기법을 후위 표기법으로 변환.
    • 큐를 사용해 너비 우선 탐색 (BFS) 구현.
    • 스택으로 최대 히스토그램 넓이를 구하기.

3. DFS (깊이 우선 탐색)

  • 키워드:
    • "그래프", "트리", "모든 경로 탐색", "재귀", "연결된 노드 찾기"
    • "한 번 방문 후 되돌아오기", "미로 찾기"
  • 예시 문제:
    • 그래프에서 연결 요소의 개수 구하기.
    • 특정 시작점에서 모든 노드 방문하기.
    • 트리에서 모든 루트-리프 경로 찾기.
    • 미로의 출구까지 가는 경로 찾기.
    • 섬의 개수를 세는 문제.
    • 특정 노드가 도달 가능한 노드의 집합 구하기.

4. BFS (너비 우선 탐색)

  • 키워드:
    • "최단 거리", "층별 탐색", "그래프", "큐 활용"
    • "최소 단계", "주변 노드 먼저 탐색", 단 모든 노드 탐색에 사용, 최소 신장 트리는 최소 비용 
  • 예시 문제:
    • 미로에서 출발점에서 도착점까지의 최단 거리 찾기.
    • 그래프에서 두 노드 간 최단 경로 구하기.
    • 특정 레벨에 존재하는 노드 출력하기.
    • 바이러스 퍼짐 문제 (감염된 컴퓨터 찾기).
    • 특정 거리 이하로 연결된 노드 집합 구하기.
    • 토마토 숙성 문제 (2D 배열 BFS).


5. 플러드 필 (Flood Fill) = DFS를 활용한 재귀적 탐색 방법

  • 키워드:
    • "이미지 채우기", "영역 탐색", "같은 색 그룹 찾기"
    • "2D 배열", "인접 노드 탐색"
  • 예시 문제:
    • 2D 배열에서 연결된 동일 색상 영역 채우기.( 블록 색상을 채우는 게임에서 같은 색으로 연결된 블록을 선택하면 블록들이 전부 사라지거나 다른 색으로 바뀝니다. )
    • 섬의 개수를 세는 문제 (2D 배열).
    • 특정 지점으로부터 연결된 영역의 크기 구하기.
    • 게임 맵에서 특정 조건을 만족하는 영역 색칠하기.
    • 특정 구역에서 물이 퍼지는 경로 찾기.
    • 특정 값과 같은 인접한 셀을 모두 변환.

6. 브루트 포스 (완전 탐색)

  • 키워드:
    • "모든 경우의 수 탐색", "가능한 모든 조합/경우 시도"
    • "효율성보다는 정답 보장", "제약 조건 없는 탐색"
  • 예시 문제:
    • 숫자 배열에서 가능한 모든 부분 집합의 합 구하기.
    • n개의 숫자로 만들 수 있는 모든 조합 출력.
    • 주어진 단어의 모든 순열 생성.
    • 특정 길이의 모든 부분 문자열을 탐색.
    • 특정 조건을 만족하는 수열 조합 찾기.
    • 특정 위치에서 나이트의 이동 가능성 확인.

7. 그리디 알고리즘

  • 키워드:
    • "매 순간 최적의 선택", "국소 최적 → 전체 최적"
    • "정렬된 데이터", "최소/최대 값 구하기"
  • 예시 문제:
    • 동전의 최소 개수로 금액 만들기.
    • 가장 많은 회의를 배정하는 회의실 문제.
    • 배낭 문제 (Greedy Knapsack).
    • 문자열을 뒤집지 않고 사전순으로 가장 작은 문자열 만들기.
    • 최소한의 구간으로 커버하기.
    • 높은 점수를 우선적으로 선택하는 문제.


8. 이분 탐색

  • 키워드:
    • "정렬된 데이터", "탐색 범위 줄이기", "중간값 비교"
    • "정확한 값 찾기", "최소/최대 조건 만족"
  • 예시 문제:
    • 정렬된 배열에서 특정 값을 찾기.
    • 특정 조건을 만족하는 최소/최대 값 찾기 (예: 부피, 시간).
    • 특정 목표 값을 만들기 위한 숫자 조합 탐색.
    • 제곱근 계산 (수치 해석).
    • 배열의 가장 가까운 값을 찾기.
    • 정렬된 배열에서 삽입 위치 구하기.

9. 그래프

  • 키워드:
    • "노드와 간선", "연결된 데이터", "인접 리스트/행렬"
    • "경로 찾기", "연결 여부 확인"
  • 예시 문제:
    • 그래프에서 두 노드 간 경로가 존재하는지 확인.
    • 가중치 없는 그래프에서 최단 경로 구하기.
    • 특정 그래프가 사이클을 포함하는지 확인.
    • 트리의 높이 구하기.
    • 그래프가 연결되어 있는지 확인.
    • 이분 그래프인지 판별하기.

10. 투 포인터, 슬라이딩 윈도

  • 키워드:
    • "배열의 구간", "서로 다른 두 포인터", "연속된 부분"
    • "특정 조건 만족하는 구간", "최소/최대 길이"
  • 예시 문제:
    • 배열에서 특정 합을 만족하는 부분 배열 찾기.
    • 문자열에서 가장 긴 중복 없는 부분 문자열 찾기.
    • 배열의 최대/최소 평균 구간 찾기.
    • 정렬된 배열에서 두 합이 특정 값을 만족하는 두 숫자 찾기.
    • 특정 조건을 만족하는 최소 구간 길이 찾기.
    • K개를 초과하지 않는 서로 다른 문자가 포함된 가장 긴 문자열 찾기.

11. 유니온 파인드 (Union-Find)

  • 키워드:
    • "집합 찾기", "그래프에서 사이클 확인", "연결 여부"
    • "최소 신장 트리", "네트워크 연결 확인"
  • 예시 문제:
    • 그래프에서 사이클 확인하기.
    • 특정 네트워크의 연결 상태 파악하기.
    • 최소 신장 트리 생성 (Kruskal 알고리즘).
    • 도시 간 연결 여부를 확인하는 문제.
    • 특정 노드 그룹이 같은 집합인지 확인.
    • 친구 관계를 그룹으로 묶기.

12. 최소 신장 트리 (MST, Kruskal/Prim)

  • 키워드:
    • "가중치 그래프", "모든 노드 연결", "최소 비용"
    • "네트워크 설계", "간선 선택"
  • 예시 문제:
    • 도시를 연결하는 도로의 최소 비용 계산.
    • 특정 지역 네트워크 연결 비용 줄이기.
    • 통신망을 최소 비용으로 구축하기.
    • 그래프의 모든 노드를 연결하는 최소 간선 찾기.
    • 전기 배선을 최적화하는 문제.
    • 케이블 설치를 위한 최소 비용 계산.

 


13. 비트 마스킹

  • 키워드:
    • "이진수 표현(0, 1로 표현 가능한 경우)", "상태 저장", "조합/부분집합"
    • "효율적인 데이터 표현", "AND, OR, XOR"
  • 예시 문제:
    • n개의 숫자 중 조건을 만족하는 모든 부분집합 구하기.
    • 집합의 모든 부분 집합 출력하기.
    • 두 집합의 교집합 계산하기.
    • 특정 비트가 켜져 있는지 확인하기.
    • 비트 상태를 변환해 최소 전환 횟수 계산하기.
    • 스위치 상태를 변경해 최적 상태로 만들기.

'Coding Test > 학습 방식' 카테고리의 다른 글

코딩테스트 풀이 공식  (3) 2024.11.20

코딩테스트 풀이 공식

 

1. 문제 분석

  1. 문제 읽기 및 요구사항 파악
    • 입력과 출력의 형식, 제약 조건을 정확히 확인.
    • 해결해야 할 핵심 목표가 무엇인지 정의.
  2. 예제 분석
    • 제공된 예제를 통해 요구사항을 검증.
    • 주어진 예제가 부족하면 추가 예제를 손수 만들어 테스트 케이스를 확장.
  3. 핵심 키워드 도출
    • "그래프", "최단 거리", "조합", "정렬" 등 문제의 성격을 결정짓는 단서를 찾기.

2. 풀이 설계

  1. 문제를 작은 단위로 나누기
    • 문제를 여러 단계로 쪼개서 처리해야 할 작업 목록 작성.
      예) 데이터 입력 → 전처리 → 탐색 → 결과 출력.
  2. 적합한 알고리즘 및 자료구조 선택
    • 키워드에 맞는 알고리즘 (e.g., DFS, BFS, DP) 및 자료구조 선택.
      • 그래프 → DFS, BFS
      • 최적화 → DP, 그리디
      • 정렬 → 힙, 퀵소트
    • 자료구조를 고려 (e.g., 배열, 해시맵, 스택, 큐, 트리).
  3. 클래스 또는 함수 설계
    • 문제를 해결하는 데 필요한 클래스나 함수 정의.
      • 데이터 처리: InputHandler 클래스.
      • 계산/탐색: Solver 클래스.
      • 결과 출력: OutputHandler 클래스.
    • 설계를 통해 코드의 유지보수성과 가독성 향상.
  4. 의사코드 작성
    • 알고리즘의 흐름을 간략히 적어서 문제 풀이의 기본 구조 설계.

3. 구현

  1. 입력 처리
    • 입력 형식에 맞는 데이터 전처리. (e.g., 문자열 → 리스트 변환, 그래프 → 인접 리스트 생성)
  2. 알고리즘 구현
    • 설계한 대로 알고리즘을 차례로 작성.
  3. 클래스/함수 호출
    • 전체 구조에 맞게 코드의 흐름 정리.

4. 테스트 및 디버깅

  1. 제공된 예제 테스트
    • 문제에서 제공된 예제를 사용해 정상적으로 동작하는지 확인.
  2. 엣지 케이스 추가 테스트
    • 예외 상황이나 극단적인 입력을 넣어 프로그램의 안정성 점검.
  3. 시간 복잡도 및 메모리 최적화 검토
    • 입력의 범위와 제약 조건에 따라 효율성을 재검토.

5. 최종 제출

  1. 코드 정리 및 주석 추가
    • 가독성을 위해 불필요한 코드를 제거하고 주석으로 설명.
  2. 최종 테스트
    • 마지막으로 다시 한 번 전체 흐름을 확인 후 제출.

 

 

예제

 

체계적 풀이 적용 (DFS 활용)

문제: N개의 노드와 M개의 간선이 주어진 그래프에서 연결 요소의 개수를 구하라.


  1. 문제 분석
    • 입력: 노드 수, 간선 정보 (간선의 연결 리스트).
    • 출력: 연결 요소의 개수.
  2. 풀이 설계
    • 그래프 탐색 필요 → DFS 사용.
    • 방문 여부를 저장할 visited 배열 필요.
    • 모든 노드에 대해 DFS를 호출하며 연결 요소 카운트.
  3. 클래스 설계
    • Graph 클래스: 그래프 생성 및 데이터 저장.
    • DFS 함수: 연결 요소 탐색.
  4. 구현
class Graph:
    def __init__(self, n):
        self.graph = [[] for _ in range(n + 1)]
        self.visited = [False] * (n + 1)
    
    def add_edge(self, u, v):
        self.graph[u].append(v)
        self.graph[v].append(u)
    
    def dfs(self, node):
        self.visited[node] = True
        for neighbor in self.graph[node]:
            if not self.visited[neighbor]:
                self.dfs(neighbor)

def count_connected_components(n, edges):
    graph = Graph(n)
    for u, v in edges:
        graph.add_edge(u, v)
    
    count = 0
    for node in range(1, n + 1):
        if not graph.visited[node]:
            graph.dfs(node)
            count += 1
    return count

'Coding Test > 학습 방식' 카테고리의 다른 글

알고리즘 별 문제 파악 키워드  (1) 2024.11.21

+ Recent posts