코딩 테스트 준비하면서 핵심 요약

 

파이썬으로 준비합니다.

 

많은 부분을 나동빈님 저자,

이것이 취업을 위한 코딩 테스트다 with Python 를 참고하였습니다.

 

외워야할 것 들

 

import sys

input = lambda: sys.stdin.readline().rstrip()
sys.setrecursionlimit( LIMIT )

from collections import deque
from itertools import combinations, permutations
import math

math.ceil()
math.floor( NUMBER + 0.5 ) # 반올림

import heapq

q = []
heapq.heappush(q, NUMBER)
n = heapq.heappop(q)

arr = ARRAY
heapq.heapify(arr)

INF = int(1e9)

문자열.isdigit()

 

문제를 보면서 확인할 것들

 

입력의 크기

어떤 유형의 알고리즘

입력의 경계에서 생각

최악의 상황

가장 간단하게 해결해보고 개선

 

본격적인 알고리즘

 

그리디

당장 좋은 것을 골라서 해결

위 방법으로 실행하여도 정답을 보장할 수 있도록 검증하여야 함

문제를 해결할 수 있는 가장 좋은 방법이 아니더라도 개선하면서 해결할 수 있다.

 

구현

시뮬레이션

dx, dy 혹은 steps

DFS, BFS와 같은 완전 탐색과 다른 동작의 시뮬레이션 문제일 수 있다.

 

DFS, BFS

노드 관계를 표현하는 방법: 행렬, 리스트

방문한 노드를 따로 저장한다.

 

DFS

스택으로 구현

스택에 추가되는 경우: 현재 노드에서 방문하지 않은 노드 중에 다음 방문예정인 노드

스택에서 빠지는 경우: 주변 노드들이 다 방문했을 때

 

BFS

큐로 구현

큐에 추가되는 경우: 현재 노드에서 방문하지 않은 노드 전부

큐에서 빠지는 경우: 방문하면서 빠진다

 

정렬

선택: 순서대로 작은 원소를 찾아서 앞으로 배치

삽입: 인덱스를 앞에서부터 하나씩 옮기면서 정렬한다. 앞부분은 정렬이 되채로 유지되게 하고 인덱스가 가리키는 원소가 정렬을 유지하게끔 삽입한다.

퀵: pivot을 이용하여 좌, 우를 pivot보다 작은 원소들 그리고 큰 원소들로 정렬한다. 분할 정복한다.

머지: 퀵과 유사하나 분할 정복 후 다시 합치는 과정이 있고 최악의 경우에도 NlogN을 보장

버블: 2개씩 비교하며 자리를 바꾸는 것을 반복한다.

 

이진탐색

정렬을 전제로 한다.

입력크기가 상당히 크다면(10억 이상) 생각해본다.

 

DP

메모리를 더 써서 빠르게 해결하는 방법

큰 문제를 작은 문제로 나눌 수 있고 작은 문제의 정답이 큰 문제에서도 동일할 경우에 사용한다.

DP의 핵심은 점화식으로 표현하는 것이다.

수학처럼 문제에서 요구하는 내용을 점화식으로 표현하고 도식화하여 직접 실행해본다.

바텀업과 탑다운 방식이 있고 탑다운 방식은 재귀적으로, 바텀업은 반복적으로 해결하는 것이다.