매일은 아니더라도 꾸준하게
728x90

Python 11

[알고리즘이론] 해밀턴 경로(Hamiltonian path) 파이썬으로 구현하기

해밀턴 경로(Hamiltonian path)는 그래프에서 모든 정점을 한 번씩만 방문하면서 이동하는 경로입니다. 파이썬으로 해밀턴 경로를 구하는 알고리즘은 다음과 같습니다. 그래프의 모든 정점에 대해, 해당 정점을 시작점으로 해서 DFS 탐색을 시작합니다. DFS 탐색에서, 이미 방문한 정점은 다시 방문하지 않도록 체크합니다. DFS 탐색에서, 모든 정점을 방문한 경우에는 해당 경로를 반환합니다. DFS 탐색에서, 방문하지 않은 정점을 선택해서 다음 DFS 탐색을 수행합니다. 파이썬 코드로 구현하면 다음과 같습니다. def find_hamiltonian_path(graph): def dfs(current, visited, path): visited[current] = True path.append(cur..

[알고리즘이론] 오일러 경로(Eulerian path) 파이썬으로 구현하기

오일러 경로(Eulerian path)는 그래프의 모든 간선을 한 번씩만 방문하면서 출발점과 도착점이 다른 경로입니다. 파이썬으로 오일러 경로를 구하는 알고리즘은 다음과 같습니다. 그래프가 오일러 경로가 되는지 확인합니다. 이를 위해서는 그래프가 무방향 그래프이고 모든 정점의 차수가 짝수이거나, 정확히 두 개의 정점의 차수가 홀수이어야 합니다. 오일러 경로가 있다면 시작 정점을 선택합니다. 시작 정점은 차수가 홀수인 정점 중 임의의 하나를 선택하거나, 그렇지 않으면 아무 정점이나 선택할 수 있습니다. 시작 정점에서 출발하여 갈 수 있는 경로가 있는 동안 이동합니다. 이동한 경로는 스택에 저장합니다. 이동한 경로의 마지막 노드에서 출발하여 갈 수 있는 경로가 있는 동안 이동합니다. 이동한 경로도 스택에 저..

[알고리즘이론] 그래프 파이썬으로 구현하기

파이썬에서 그래프를 구현하는 방법은 여러 가지가 있습니다. 이 중에서 대표적인 방법은 인접 리스트와 인접 행렬입니다. 인접 리스트 인접 리스트(Adjacency List)는 그래프를 연결 리스트로 표현하는 방식입니다. 파이썬에서는 딕셔너리를 이용하여 각 노드에 연결된 노드들을 리스트로 저장합니다. 예를 들어, 다음과 같은 인접리스트가 있다고 합시다. graph = { 'A': ['B', 'C'], 'B': ['A', 'C', 'D'], 'C': ['A', 'B', 'D', 'E'], 'D': ['B', 'C', 'E', 'F'], 'E': ['C', 'D'], 'F': ['D'] } 위 코드에서 graph 딕셔너리는 각 노드와 그에 대한 연결 리스트를 저장합니다. 예를 들어, 'A' 노드와 연결된 노드들..

[알고리즘이론] 백트래킹(Backtracking) 파이썬으로 구현하기

백트래킹(Backtracking)은 해를 찾는 도중에 가능성이 없는 부분을 차단하여 불필요한 탐색을 줄이는 알고리즘입니다. 파이썬에서는 다음과 같이 백트래킹 알고리즘을 구현할 수 있습니다. 예제: N-Queen 문제 N x N 크기의 체스판 위에 N개의 퀸을 놓는 문제입니다. 퀸은 가로, 세로, 대각선 방향으로 모두 공격할 수 있으므로, 서로 공격할 수 없도록 N개의 퀸을 놓는 문제입니다. 백트래킹 알고리즘을 사용하여 퀸을 놓을 수 있는 모든 경우의 수를 구합니다. def is_available(candidate, current_col): current_row = len(candidate) for queen_row in range(current_row): if candidate[queen_row] == ..

[알고리즘이론] 분할정복(Divide and Conquer) 파이썬으로 구현하기

분할정복(Divide and Conquer) 알고리즘은 큰 문제를 작은 문제로 분할한 후, 각 작은 문제를 해결하고, 이를 합쳐서 큰 문제를 해결하는 알고리즘입니다. 파이썬에서는 다음과 같이 분할정복 알고리즘을 구현할 수 있습니다. 예제: 이진 탐색 주어진 정렬된 리스트에서 특정한 값의 위치를 찾는 문제입니다. 이진 탐색은 리스트의 중간 위치의 값을 검사하여 찾고자 하는 값이 리스트의 중간 위치보다 큰지 작은지를 비교하여 검색 범위를 절반으로 줄여가면서 값을 찾아갑니다. def binary_search(lst, x): start = 0 end = len(lst) - 1 while start x: end = mid - 1 else: start = mid + 1 return -1 # 정렬된 리스트에서 5의 ..

[알고리즘이론] 그리디(Greedy) 파이썬으로 구현하기

그리디(Greedy) 알고리즘은 현재 상황에서 가장 좋은 선택을 하는 것을 반복하여 최적해를 구하는 알고리즘 기법입니다. 파이썬에서는 다음과 같이 그리디 알고리즘을 구현할 수 있습니다. 예제1: 동전 거스름돈 문제 n원의 동전을 거슬러 주어야 할 때, 거슬러 줄 동전의 개수가 최소가 되도록 하려면 어떻게 거슬러 줘야 할까요? 예를 들어, 1260원을 거슬러 주어야 할 때, 500원, 100원, 50원, 10원 동전이 각각 몇 개씩 필요한지 구하는 문제입니다. def change(n): coins = [500, 100, 50, 10] # 동전 종류 count = 0 # 거슬러 준 동전 개수 for coin in coins: count += n // coin # 동전 개수 누적 n %= coin # 거슬러 ..

[알고리즘이론] 완전탐색(Brute-force) 파이썬으로 구현하기

완전탐색(Brute-force)은 가능한 모든 경우를 검사하여 답을 찾는 알고리즘 기법입니다. 파이썬에서는 다음과 같이 완전탐색을 구현할 수 있습니다. 예제1: 주어진 리스트에서 최대값 찾기 def find_max(lst): max_value = lst[0] for i in range(1, len(lst)): if lst[i] > max_value: max_value = lst[i] return max_value # 주어진 리스트에서 최대값 찾기 lst = [3, 1, 5, 2, 4] print(find_max(lst)) 위 코드에서 find_max() 함수는 주어진 리스트에서 최대값을 찾아 리턴합니다. max_value 변수에 리스트의 첫번째 값을 할당하고, 반복문을 통해 리스트의 각 요소를 검사하면서..

[알고리즘이론] DP(Dynamic Programming : 동적 프로그래밍) 파이썬으로 구현하기

DP(Dynamic Programming)는 이전에 계산한 값을 저장해 놓고 재활용하여 중복 계산을 줄이는 알고리즘 기법입니다. 파이썬에서는 DP를 구현하는 방법은 여러가지가 있습니다. 여기서는 Memoization 방식과 Bottom-up 방식을 예제 코드로 설명하겠습니다. Memoization 방식 Memoization은 이전에 계산한 값을 저장하고 재활용하는 방식입니다. 이전에 계산한 값이 필요할 때마다 값을 조회하여 사용합니다. Memoization 방식은 보통 재귀 함수와 함께 사용됩니다. 아래는 Memoization 방식을 사용하여 피보나치 수열을 구하는 예제 코드입니다. # Memoization 방식으로 구현한 피보나치 수열 예제 memo = [0] * 100 # 메모이제이션을 위한 리스트 ..

[알고리즘이론] 파이썬 자료구조

파이썬에서는 다양한 자료구조를 제공합니다. 각 자료구조의 특징과 사용 방법을 살펴보겠습니다. 리스트(List) 리스트는 순서가 있는 데이터의 집합으로, 대괄호([])로 표현합니다. 원소들은 쉼표로 구분합니다. 리스트는 수정이 가능하며, 인덱싱과 슬라이싱을 통해 데이터를 접근할 수 있습니다. 예시: a = [1, 2, 3, 4, 5] # 리스트 생성 print(a) # [1, 2, 3, 4, 5] print(a[0]) # 1 print(a[2:4]) # [3, 4] a[1] = 10 # 리스트 값 수정 print(a) # [1, 10, 3, 4, 5] 튜플(Tuple) 튜플은 리스트와 유사하지만, 수정이 불가능합니다. 소괄호(())로 표현합니다. 예시: a = (1, 2, 3) # 튜플 생성 print(a..

[알고리즘이론] 파이썬으로 BFS 구현

BFS(Breadth-First Search)는 큐(Queue)를 이용하여 구현할 수 있습니다. 큐는 선입선출(FIFO) 구조이므로, BFS에서는 현재 노드와 인접한 노드 중 방문하지 않은 노드가 있으면 해당 노드를 큐에 삽입하고 방문 처리합니다. 그리고 큐에서 꺼낸 노드를 다시 시작점으로 하여 인접한 노드 중 방문하지 않은 노드가 있으면 큐에 삽입하고 방문 처리합니다. 이 과정을 큐가 빌 때까지 반복하면 됩니다. 아래는 큐를 사용하여 BFS를 구현한 예제 코드입니다. # 큐를 사용한 BFS 구현 예제 from collections import deque def bfs(start, adj_list): visited = [False] * len(adj_list) # 각 노드의 방문 여부를 저장할 리스트 q..

728x90