전체 글 84

프루닝(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

[머신러닝/딥러닝] 데이터 전처리

데이터 전처리훈련 데이터의 특성의 스케일이 다르면 스케일이 큰 특성에 의존하게 되어 학습이 제대로 되지 않는다. 따라서 데이터 전처리가 필요하다. 대표적으로는, 표준점수를 사용한다. 표준점수는 '(데이터 - 평균) / 표준편차'로 구할 수 있다.주의: 테스트 데이터도 전처리를 해줘야 한다. 이때 꼭 훈련 데이터에서 구한 평균과 표준편차를 사용해야 한다! 모든 경우에 데이터 전처리를 해줘야 할까?아니다!딥러닝과 거리 기반 알고리즘(KNN, SVM 등)은 특성의 크기가 다르면 거리 계산이 왜곡되므로 표준화가 필수적이다!하지만, 트리 기반 알고리즘(XGBoost 등)의 경우 스케일에 영향을 받지 않으므로 표준화가 불필요하다.즉, 모든 경우에 표준화를 적용할 필요는 없고, 모델 특성에 따라 선택해야 한다.

카테고리 없음 2025.02.11

[머신러닝/딥러닝] 지도학습과 비지도학습

📌 지도 학습지도 학습은 학습 데이터(인풋)와 정답(타겟)이 존재한다. 컴퓨터는 (인풋, 타겟)의 정보를 학습해서 새로운 인풋 데이터가 왔을 때 타겟을 유추한다. 훈련 세트와 테스트 세트이때, 컴퓨터를 학습시키는 (인풋, 타겟) 데이터 셋을 '훈련 세트(Training Set)'라고 하고, 학습이 끝난 후, 학습을 평가할 때 사용하는 데이터 셋을 '테스트 세트(Test Set)'라고 한다. 보통 훈련 세트 안에서 일정 부분을 뽑아서 테스트 세트로 설정한다. 샘플링 편향훈련 세트와 테스트 세트는 편향될 경우 이상한 결과를 낼 수 있다(샘플링 편향). 그래서 고르게 섞어줘야 한다.이를 방지하기 위해 k-fold 교차 검증(아래에 설명) 같은 기법을 사용할 수 있다. 지도 학습의 주요 유형회귀(regress..

카테고리 없음 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

dart 문법 4

classclas를 생성할 때는 타입을 꼭 명시해야 한다.String name = 'nico'; // Ovar name = 'nico'; // X class Player{ String name = 'nico'; int xp = 1500;}void main() { var player = Player(); print(player.name); // nico player.name = 'lalala'; print(player.name); // lalala}class Player{ final String name = 'nico'; int xp = 1500;}final로 선언해서 name을 클래스 밖에서 수정하지 못하게 만듦.method 정의하기class Player { final String name = 'n..

카테고리 없음 2025.01.15