코딩 테스트 35

프루닝(Pruning)의 활용 방법

♦️백트래킹(Backtracking)에 활용모든 경우를 탐색하지만, 가능성이 없는 경로는 미리 포기한다. 쓸데없는 재귀 호출을 줄여서 속도를 높일 수 있다. 예시 문제 [N-Queen] : N×N 체스판에 N개의 퀸을 놓을 수 있는 경우의 수를 구하라. 단, 퀸은 같은 행, 열, 대각선에 놓일 수 없다. 1. 백트래킹한 줄씩 퀸을 배치하면서 모든 가능한 경우를 탐색만약 조건을 만족하지 않으면 즉시 탐색을 중단 (Pruning)2. 프루닝같은 열이나 같은 대각선에 퀸이 있으면 가지치기!def is_safe(row, col, queens): """현재 (row, col)에 놓을 수 있는지 체크""" for r, c in enumerate(queens): # 이전에 놓은 퀸들의 위치 ..

코딩 테스트 2025.02.11

브루트포스와 프루닝

브루트 포스 (Brute Force)가능한 모든 경우를 탐색하는 것. 그렇기 때문에, 코딩 문제를 풀 때 시간 초과가 날 가능성이 높다.따라서 필요 없는 탐색을 줄여야 한다. 프루닝(Pruning)Pruning(가지치기)는 불필요한 탐색을 미리 제거하여 탐색 공간을 줄이는 기법이다. 답이 될 가능성이 없는 경로는 더 이상 탐색하지 않고 가지를 쳐버린다.    코딩 문제 풀 때1. 먼저 브루트포스로 해결 해보자2. 시간 초과가 나면 Pruning을 적용하여 탐색 공간을 줄이자.

코딩 테스트 2025.02.11

MST(Minimum Spanning Tree, 최소 신장 트리): 크루스칼 알고리즘

저번에 간단하게 봤던 크루스칼 알고리즘에 대해 자세하게 공부해봤다.class DisjointSet: """유니온 파인드(Disjoint Set) 자료구조 구현""" def __init__(self, n): self.parent = list(range(n)) # 각 노드의 부모를 자기 자신으로 초기화 def find(self, x): """루트 노드를 찾는 함수 (경로 압축 적용)""" if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) # 경로 압축 return self.parent[x] def union(self, a, b): "..

코딩 테스트 2025.02.07

그래프와 최단 거리 문제: MST & TSP

1. Euclidean Distance (유클리드 거리)두 점 (x1, y1)와 (x2, y2) 사이의 거리를 계산하는 공식이다.2차원 뿐만 아니라, n차원에서도 같은 원리를 사용한다.유클리드 거리 공식은 2차원뿐만 아니라, 3차원, 4차원, ..., n차원에서도 동일한 원리로 적용할 수 있다.3차원으로 확장하면?n차원에서는?즉, 차원이 늘어나도 각 좌표의 차이를 제곱한 후 더하고, 루트를 씌우는 원리는 변함없다.# 2차원에서 유클리드 거리 계산 코드import mathdef euclidean_distance(p1, p2): return math.sqrt((p2[0] - p1[0]) ** 2 + (p2[1] - p1[1]) ** 2)p1 = (1, 2)p2 = (4, 6)print(euclidean..

코딩 테스트 2025.02.06

[python에서 priority queue 자료구조 사용하기 / heapq]

코딩 문제 하나를 풀었는데, 문제 풀이의 핵심이 '가지고 있는 값들 중에 가장 큰 값 두 개를 반복적으로 꺼내는 것'이였다. 이 문제를 풀려면 priority queue 자료구조를 사용하는 것이 효과적이라고 판단했다. 파이썬에서는 priority queue를 heapq로 편하게 사용할 수 있다. 그래서 오늘은 이 heapq에 대해 공부해봤다.1. 먼저, priority queue를 사용해서 이 문제를 푸는 데 걸리는 시간은 O(nlogn)이다.2. heapq를 사용하려면 먼저 import heapq를 해야 한다.3. heapq 라이브러리의 주요 메서드 - heapq.heapify(list): 리스트를 heap으로 변환한다.- heapq.heappop(heap): heap에서 가장 작은 원소를 pop, 리..

코딩 테스트 2025.02.03

스택과 큐

스택 LIFO: Last-in First-out. 나중에 들어온 데이터가 먼저 나간다. 스택은 DFS: Depth First Search, 백트래킹 문제를 풀 때 사용한다. 후입선출은 재귀 함수 알고리즘 원리와 같다. top: 삽입, 삭제가 일어나는 위치 파이썬 연산(리스트 이용) s.append(data): top 위치에 data를 저장 s.pop(): top 위치에 있는 데이터를 삭제, 확인 s[-1]: top 위치에 있는 데이터 확인 큐 FIFO: First-in First-out. 먼저 들어온 데이터가 먼저 나간다. 삽입과 삭제가 양방향에서 이루어진다. BFS: Breadth First Search에서 사용됨. rear: 큐에서 가장 끝데이터 front: 큐에서 가장 앞 데이터 파이썬 연산(리스트..

코딩 테스트 2023.11.19

구간 합

합 배열(S)을 구하는 것부터 시작한다. S[i] = A[0] + A[1] + ... + A[i-1] + A[i] 인덱스 0 1 2 3 4 5 리스트 A 3 5 2 1 9 6 합 배열 S 3 8 10 11 20 26 ex) S[4] = A[0] + A[1] + A[2] + A[3] + A[4] = 3 + 5 + 2 + 1 + 9 = 20 A[i] ~ A[j] 리스트의 합을 구한다고 하자. - 합 배열(S) 없이 구한다면, 최악의 경우 시간 복잡도가 O(N)이다. - 하지만 위의 합 배열을 사용한다면 O(1)으로 시간 복잡도가 확 줄어든다. 합 배열 S 구하는 공식 S[i] = S[i-1] + A[i] 구간 합 구하는 공식(A[i] ~ A[j] 리스트의 합) S[j] - S[i-1] 예를 들어서 A[1] ..

코딩 테스트 2023.11.18

배열과 리스트

파이썬에서는 리스트가 배열의 특성도 함께 내포하고 있지만, 배열과 리스트는 확실히 다른 자료구조이다. 배열 메모리의 연속 공간에 값이 채워져 있는 형태의 자료구조이다. 인덱스를 사용하여 값에 바로 접근할 수 있다. 새로운 값을 삽입하거나 특정 인덱스에 있는 값을 삭제하기 어렵다. 값을 삽입하거나 삭제하려면 해당 인덱스 주변에 있는 값을 이동시키는 과정이 필요하다. 배열의 크기는 선언할 때 지정할 수 있으며, 한 번 선언하면 크기를 늘리거나 줄일 수 없다. 리스트 값과 포인터를 묶은 '노드'를 포인터로 연결한 자료구조이다. 인덱스가 없으므로 값에 접근하려면 Head 포인터부터 순서대로 접근해야 한다. (접근하는 속도가 느리다.) 포인터로 연결되어 있으므로 데이터를 삽입하거나 삭제하는 연산 속도가 빠르다. ..

코딩 테스트 2023.11.18

시간 복잡도

[Do it! 알고리즘 코딩 테스트] 최근에 백준 문제 푸는거에 재미를 붙였다. 지금 실버1인데 올해 안에 골드 1이 되겠다는 목표로 열심히 풀어보고자 한다. 지금 실력으로는 문제를 보면서 어떤 알고리즘을 써야 하는지 바로 떠올리기가 힘들다. 그래서 알고리즘 공부를 찬찬히 하면서 실력을 기르려고 한다. 이 책을 2주 안에 끝낼 것이다! 시간 복잡도 어떤 알고리즘을 써서 문제를 풀어야 할지를 결정하는데 시간 복잡도가 중요하다. 일반적으로 파이썬은 1초에 2000만~1억 번 연산을 한다. 최악의 경우를 따져봐야 하기 때문에 파이썬이 1초에 2000만 번 연산을 한다고 생각하고 계산하자. 예를 들어 수를 정렬하는 문제가 있다. 시간 제한은 2초이고, 수의 개수 N(1

코딩 테스트 2023.11.17

[백준 2164번 카드2] deque 사용하기

https://www.acmicpc.net/problem/2164 2164번: 카드2 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 www.acmicpc.net list 사용해서 몇 번이나 풀었는데도 시간초과로 실패했다. import deque를 사용했더니 단번에 풀렸다. from collections import deque n = int(input()) queue = deque([i for i in range(1, n+1)]) while len(queue) != 1: queue.popleft() if len(queue) == 1: break queue...

코딩 테스트 2023.10.31