글

라벨이 algorithm인 게시물 표시

DFS에서 재귀를 사용하는 방법 vs 스택을 사용하는 방법

DFS에서 재귀를 사용하는 방법 vs 스택을 사용하는 방법 DFS(Depth-First Search)에서 **재귀를 사용하는 방법**과 **스택을 사용하는 방법**은 사실상 같은 논리를 구현하지만, 사용하는 스택의 종류가 다를 뿐이에요: 1. **재귀를 사용하는 DFS**:      재귀 호출은 시스템 스택을 이용해 함수 호출 정보를 저장해요. 이 경우, 재귀 함수가 호출될 때마다 시스템 스택에 함수 호출이 쌓이고, 함수가 종료되면 스택에서 빠져나가는 방식으로 동작해요. 즉, **시스템의 호출 스택(Call Stack)**을 직접 이용하는 거죠. 2. **스택을 사용하는 DFS**:      이 방법은 명시적으로 `stack` 자료구조를 사용하여 구현해요. 우리가 직접 스택을 선언하고, 노드를 추가(push)하고 제거(pop)하면서 DFS를 수행하는 거예요. 재귀 없이 반복문(while)을 사용하여 스택이 빌 때까지 탐색을 진행하죠. 정리하자면, **재귀 DFS는 시스템 스택을 사용하는 DFS**이고, **명시적 스택을 사용하는 DFS는 우리가 직접 관리하는 스택을 사용하는 DFS**라는 차이가 있을 뿐, 알고리즘의 동작 방식은 동일합니다. 두 방법의 차이점으로는 다음이 있어요: - **시스템 스택(재귀)**은 깊이가 깊어질수록 스택 오버플로우(Stack Overflow) 위험이 커질 수 있어요. 보통 C/C++ 같은 언어에서는 재귀 깊이가 수천~수만 이상이 되면 스택 오버플로우를 발생시킬 수 있죠. - **명시적 스택**을 사용하면 스택 크기를 코드에서 제어할 수 있기 때문에, 매우 깊은 트리 구조에서도 상대적으로 안전하게 사용할 수 있어요. 따라서, **스택의 크기와 깊이가 중요한 문제**에서는 재귀보다 명시적 스택을 사용하는 것이 더 안전할 수 있습니다. ## 재귀는 항상 지양해야 하나? 그렇다고 재귀를 무조건 피할 필요는 없어요. 상황에 따라 재귀와 명시적 스택(반복문) 중 어떤 것을...

python javascript 입출력 (알고리즘 문제용)

 https://help.acmicpc.net/language/info # 파이썬 알고리즘 문제 빠른 입출력 ```python import sys #한줄씩 n=sys.stdin.readline().rstrip() N,S=map(int,sys.stdin.readline().rstrip().split()) # 여러줄 한번에 input_str = sys.stdin.read().rstrip().split( "\n" )  ``` --- # js 백준 ```javascript var fs = require('fs'); var input = fs.readFileSync('/dev/stdin').toString().split(' '); var a = parseInt(input[0]); var b = parseInt(input[1]); console.log(a+b); ``` eof 예시 10951 ```javascript var fs = require('fs'); var input = fs.readFileSync('/dev/stdin').toString().trimEnd().split('\n'); #전체 입력으로 해결하는데 trimEnd로 끝에 공백제거 for (let i=0;i<input.length;i++){     let [a,b]=input[i].split(" ")     console.log(Number(a)+Number(b)) } ``` --- JavaScript로 코딩 테스트를 할 때는 입출력 방식이 플랫폼마다 다를 수 있습니다. 그러나 일반적으로 사용하는 두 가지 환경에 맞춰 설명하겠습니다. 1. **Node.js 환경**:    - 대부분의 코딩 테스트 플랫폼에서 JavaScript를 실행할 때는 Node.js 환경을 사용합니다. Node.js에서 표준 입력/출력을 처리하는 방법을 알아봅니다. 2. **브라우저 환경**:    - 브라...

prim vs kruskal vs Dijkstra 프림 크루스칼 다익스트라

 Prim 알고리즘과 Kruskal 알고리즘은 둘 다 최소 신장 트리(MST, Minimum Spanning Tree)를 구하는 대표적인 알고리즘입니다. 그러나 이 두 알고리즘은 작동 방식에서 차이가 있습니다. 아래에서 차이점을 설명하겠습니다. ### 1. 작동 방식 - **Prim 알고리즘**:     - Prim 알고리즘은 그래프에서 임의의 정점을 선택하고, 해당 정점에서 시작하여 인접한 정점으로 확장하는 방식으로 최소 신장 트리를 만들어 갑니다.    - 이미 선택된 정점들로부터 가장 가중치가 작은 간선을 선택해서 새로운 정점을 포함시킵니다.    - 이 과정은 모든 정점이 포함될 때까지 반복됩니다.    - **Kruskal 알고리즘**:     - Kruskal 알고리즘은 그래프의 모든 간선을 가중치 순서대로 정렬한 다음, 가중치가 가장 작은 간선부터 선택하면서 최소 신장 트리를 구성합니다.    - 이때 사이클이 생기지 않도록 간선을 선택하며, 사이클이 발생하면 그 간선은 버려집니다.    - 간선 중심적 알고리즘으로, 간선을 하나씩 추가하는 방식입니다. ### 2. 자료 구조 - **Prim 알고리즘**:     - 주로 **힙(Heap)** 자료구조를 사용하여 가장 작은 가중치의 간선을 효율적으로 선택합니다.   - 인접 리스트나 인접 행렬을 활용하여 인접한 정점을 관리하는 경우가 많습니다.    - **Kruskal 알고리즘**:     - **분리 집합(Disjoint Set)** 자료구조, 즉 유니온-파인드(Union-Find)를 사용하여 사이클이 생기는지 여부를 관리합니다.   - 간선 리스트가 정렬된 형태로 관리됩니다. ### 3. 시간 복잡도 - **Prim 알고리즘**:   ...

python 우선순위 큐

 파이썬에서 우선순위 큐를 사용하는 방법은 여러 가지가 있지만, 대표적으로 `heapq` 모듈을 사용하는 방법이 있습니다. `heapq`는 최소 힙(min-heap)으로 동작하며, 이 힙을 사용하여 우선순위 큐를 구현할 수 있습니다. ### 기본 사용법: `heapq` 모듈 `heapq` 모듈은 리스트를 힙처럼 다룰 수 있도록 해주는 함수들을 제공합니다. 이 모듈을 이용하면 우선순위 큐를 쉽게 구현할 수 있습니다. #### 1. 힙에 원소 추가하기: `heapq.heappush()` ```python import heapq # 빈 리스트를 힙으로 사용 heap = [] # 힙에 값 추가 (우선순위 큐에 삽입) heapq.heappush(heap, 10) heapq.heappush(heap, 1) heapq.heappush(heap, 5) print(heap)  # [1, 10, 5] -> 항상 최소값이 맨 앞에 있음 ``` #### 2. 힙에서 원소 꺼내기: `heapq.heappop()` ```python # 가장 작은 값 꺼내기 (우선순위가 가장 높은 값 제거) smallest = heapq.heappop(heap) print(smallest)  # 1 print(heap)      # [5, 10] ``` #### 3. 힙에서 최소값 확인 (제거하지 않음): `heap[0]` ```python # 최소값 확인 (제거하지 않음) min_value = heap[0] print(min_value)  # 5 ``` ### 우선순위 큐에 튜플 사용하기 우선순위 큐에서 각 요소에 우선순위를 부여하고 싶다면, (우선순위, 값) 형태의 튜플을 힙에 삽입할 수 있습니다. 튜플의 첫 번째 요소를 기준으로 우선순위가 결정됩니다. ```python import heapq pq = [] # 우선순위가 낮은 순서대로 정렬됨 (1이 가장 높은 우선순위) heapq.heappush(pq, (1, "작업 1")) hea...

tree traversal

 hierarchical: 하이얼아키컬 이라고 발음 https://skilled.dev/course/tree-traversal-in-order-pre-order-post-order

python 관련 팁

python 레퍼런스 여기서 보는게 더 편한듯 https://www.w3schools.com/python/python_reference.asp 반올림 할때 python은 오사오입임을 주의 오사오입: 5 미만의 숫자는 버림하며 5 초과의 숫자는 올림.5의 경우에는 5의 앞자리가 홀수인 경우엔 올림을 하고 짝수인 경우엔 버림을 하여 짝수로 만들어준다.  원래 알고 있는 5를 올림하는 반올림은 사사오입 사사오입: 사까지는 버리고 오까지는 들인다

sorting algorithm

 quick sort merge sort heap sort bubble sort insertion sort select sort bucket sort radix sort