본문 바로가기

알고리즘4

[알고리즘] 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS) - 파이썬(python) 이번 글은 그래프와 관련된 알고리즘 문제 풀이시 자주 사용되는 깊이 우선 탐색(DFS)와 너비 우선 탐색(BFS)에 대해 알아보려 한다. 우선 DFS에 대해 알아보자 깊이 우선 탐색(DFS) 깊이우선탐색 DFS는 깊이를 우선으로 하여 탐색하는 방법이다. 최대 깊이에 도달하면 직전의 갈림길로 돌아가기 때문에 후입선출의 구조를 가진 스택(Stack)을 사용한다. DFS의 순서는 다음과 같다. 시작 노드를 결정하여 스택에 넣고 방문처리 한다. 스택의 최상단 노드에 방문하지 않은 인접 노드가 존재한다면 그 노드를 스택에 넣고 방문 처리한다. 만약 인접한 모든 노드에 방문했다면 스택에서 최상단 노드를 꺼낸다. 2번의 과정을 수행할 수 없을 때 (모든 노드에 방문했을 때) 종료한다. ※ 편의를 위해 스택 구조로 설.. 2023. 11. 25.
[알고리즘] 유니온 파인드(Union Find) - 파이썬(python) 유니온 파인드 알고리즘 이란? 그래프 알고리즘에 속하는 유니온 파인드는 주로 두 개의 노드를 선택했을 때 이 노드들이 같은 집합인지를 알아내는 알고리즘으로 '합집합 찾기'라고도 부른다. 두 개의 노드를 하나로 합치는 유니온(Union)과 선택한 노드가 어느 집합에 있는지 확인하는 파인드(Find)를 합쳐 유니온 파인드 알고리즘이라고 부른다. 유니온 파인드 과정 1. 노드의 배열을 인덱스 자기자신으로 초기화 한다. parent = [i for i in range(n+1)] 2. Find 함수 만들기 Find 함수는 노드 x의 부모노드 즉, 노드 x가 포함된 집합의 루트 노드를 찾는 함수이다. def find(x): # 만약 x의 부모가 자기자신이 아니라면 재귀를 통해 루트 노드를 찾는다. if parent.. 2023. 5. 5.
[알고리즘] 투 포인터와 슬라이딩 윈도우 - 파이썬(python) 이번에는 투 포인터와 슬라이딩 윈도우 알고리즘에 대해서 알아보자 투 포인터 알고리즘과 슬라이딩 윈도우 알고리즘은 매우 비슷하다. 두 알고리즘 모두 두 개의 포인터를 가지고 있고 포인터가 지나온 곳은 삭제하고 나아간 곳은 추가하는 방식을 가지고 있어 배열에서 원하는 값을 찾을 때 유용하게 사용된다. 다만, 투 포인터는 두 개의 포인터가 유동적으로 움직일 수 있지만, 슬라이딩 윈도우는 두 개의 포인터가 하나의 윈도우를 구성하고 있어 포인터 사이의 구간이 일정하게 고정된채로 움직인다. 그림으로 표현하면 이런 느낌이다. 투 포인터 간단한 투 포인터 예시를 살펴보자 # n개의 자연수 중에서 연속된 숫자의 합이 m이 되는 경우의 수는 몇가지일까? n,m = 10, 5 arr = [1, 2, 3, 4, 2, 5, 3.. 2023. 4. 6.
[알고리즘] 순열과 중복순열, 조합과 중복조합 직접 구현하기 - 파이썬(python) 알고리즘 문제풀이를 하다보면 흔하게 볼 수 있는 순열과 조합 알고리즘에 대해 정리하려고 한다. 순열과 조합 문제는 완전탐색을 기본으로 하여 시간이 많이 걸리는 것이 단점이다. 따라서 소요시간을 줄이기 위해 백트래킹을 사용하기도 한다. 우선은 순열과 조합의 기본적인 개념에 대해 알아보자. 순열 (Permutation) 순열은 서로 다른 N개의 원소 중 R개를 뽑아서 중복 없이 순서를 고려하여 한줄로 나열하는 것을 말한다. 순열을 구하는 공식은 nPr = n x (n-1) x (n-2) x (n-3) x … x (n-r+1)로 나타낼 수 있다. 예를 들어 [1,2,3]을 순열로 나타낸다면 결과 값은 아래와 같다. # 순열 1 2 3 / 1 3 2 / 2 1 3 / 2 3 1 / 3 1 2 / 3 2 1 / .. 2023. 3. 31.