목록Algorithm/Learning (17)
Cherry & Cherish

기본문제 graph = [ [], [2, 3, 8], [1, 7], [1, 4, 5], [3, 5], [3, 4], [7], [2, 6, 8], [1, 7] ] visited = [False] * 9 def dfs(graph, v, visited) : visited[v] = True print(v, end = ' ') for i in graph[v] : if not visited[i] : dfs(graph, i, visited) dfs(graph, 1, visited) 음료수 얼려 먹기 def dfs(x, y): if x = n or y = m: return False if graph[x][y] == 0: graph[x][y] = 1 dfs(x-1, y) dfs(x, y-1) dfs(x+1..

다이나믹 프로그래밍은 동적계획법, DP라고도 한다. 메모리 공간을 더 사용해서 연산 속도를 비약적으로 증가시킬 수 있는 대표적인 방법 중 하나다. 다이나믹 프로그래밍은 구현의 특별한 코드가 있다기 보다는, 두 가지 방식(탑다운, 바텀업)이 존재한다. 1. 다이나믹 프로그래밍 사용 문제 DP 알고리즘을 적용해 풀어야 하는 문제는 대표적으로 피보나치 수열을 예시로 들 수 있다. 피보나치 수열은 이전 두 항의 합을 현재의 항으로 다시 설정한다. 다시 말해, 점화식으로 문제를 풀어야 하는 것이다. 피보나치 수열은 손쉽게 재귀 문제로 풀 수 있는데, 이렇게 되면 주어진 숫자 n이 커질수록, 기하급수적으로 수행시간이 늘어나게 된다. 따라서 이러한 문제는 다이나믹 프로그래밍으로 해결해야 한다. 2. 다이나믹 프로그래..

그래프 알고리즘은 코딩 테스트 단골 출제 문제는 아니다. 하지만 꼭 알아야 하는 알고리즘 중 하나라고 할 수 있다. 그래프 알고리즘에 대한 팁은 “서로 다른 객체가 연결되어 있다(여러 개의 도시가 연결되어 있다)”라는 표현이 들어가면 대체로 그래프 알고리즘을 활용해야 하는 문제일 가능성이 높다. 또, 트리 자료구조는 다양한 알고리즘에서 사용되므로 꼭 암기해야 한다. 트리 자료구조는 부모에서 자식으로 내려오는 계층적인 모델에 속한다. 최소힙은 항상 부모 노드가 자식 노드보다 크기가 작은 자료구조로서 트리 자료구조에 속한다. 그래프의 구현 방법은 2가지 방식이 존재한다. 인접 행렬 : 2차원 배열을 사용하는 방식 인접 리스트 : 리스트를 사용하는 방식 2가지 모두 사용된다. 1. 서로소 집합 1-1. 서로소..

최단경로 알고리즘은 가장 짧은 경로를 찾는 알고리즘이다. 보통 그래프를 이용해서 표현하고, 각 지점은 그래프에서 노드로 표현되고 지점간 연결된 도로는 그래프에서 간선으로 표현된다. ‘한 지점에서 특정 지점까지의 최단 경로를 구해야하는 경우’, ‘모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우’ 등 다양한 사례가 존재한다. 일반적으로 사용하는 최단거리 알고리즘은 ‘다익스트라 알고리즘’, ‘플로이드 워셜 알고리즘’, ‘벨만 포드 알고리즘’ 등 여러 가지가 존재한다. 그러나 코딩 테스트에서 가장 많이 등장하는 유형은 ‘다익스트라’, ‘플로이드 워셜’ 알고리즘이다. 최단 경로 알고리즘은 DP와 그리디가 그대로 적용된다는 특징이 있다. 따라서, 그리디와 DP 유형의 하나로 보는 경우도 있다..

순차탐색이란 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법이다. count()메서드를 이용할 때도 내부에서는 순차탐색이 수행된다. 또, 특정 값의 원소가 있는지 확인하는 모든 순간에 순차탐색이 사용되며, 구현도 간단하다. def sequential_search(n, target, array): for i in range(n): if array[i] == target : return i + 1 순차탐색은 데이터 정렬 여부와 관계 없이 가장 앞에 있는 원소부터 하나씩 확인해야 한다. 따라서, 데이터의 개수가 N개일 때, 비교 연산이 필요하므로 순차탐색의 최악의 경우 시간 복잡도는 O(N)이다. 1. 이진 탐색 개념 💡 이진 탐색 - 정렬이 끝난 데이터를 시작점..

정렬이란 데이터를 특정한 기준에 따라서 순서대로 나열하는 것을 말한다. 프로그램에서 데이터를 가공할 때 오름차순이나 내림차순 등 대부분 어떤 식으로든 정렬해서 사용하는 경우가 많기에 정렬 알고리즘은 프로그램을 작성할 때 가장 많이 사용되는 알고리즘 중 하나다. 정렬 알고리즘으로 데이터를 정렬하면 이진 탐색이 가능해진다. 정렬 알고리즘은 상당히 다양한 종류가 있고, 파이썬에서는 기본 정렬 라이브러리를 사용해서 효과적으로 정렬할 수 있다. 1. 선택 정렬 1-1. 선택 정렬 개념 💡 선택 정렬 - “가장 작은 것을 선택” 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고, 그 다음 작은 데이터를 선택해 앞에서 두 번째 데이터와 바꾸는 과정을 반복 1-2. 선택 정렬 구현(Python) array = ..

DFS/BFS는 정말 코테의 단골 출제 문제이다. 그래프 탐색을 마스터 해보자! 1. 그래프 탐색 DFS/BFS로 문제를 풀기 위해서는, 그래프의 기본 구조를 알아야 한다. 그래프는 노드와 간선으로 구성되어 있다. 그래프 탐색이란 하나의 노드를 시작으로 다수의 노드를 방문하는 것을 말한다. 또한 두 노드가 간선으로 연결되어 있다면 두 노드는 인접하다라고 표현한다. 프로그래밍에서 그래프는 크게 2가지 방식으로 표현할 수 있는데 코딩 테스트에서는 이 두방식 모두 필요하다. 바로, 인접행렬과 인접 리스트다. 💡 인접 행렬 : 2차원 배열로 그래프의 연결 관계를 표현하는 방식 인접 행렬은 2차원 배열에 각 노드가 연결된 형태를 기록하는 방식이다. 위와 같이 연결된 그래프를 인접 행렬로 표현할 때 파이썬에서는 2..

그리디 알고리즘은 Greedy, 탐욕 알고리즘으로 불리기도 한다. 일반적으로 코딩테스트에서 문제를 해결 할 때에는 (몇몇의 특이 케이스를 제외하고)암기가 필요없지만, 문제의 폭이 넒다. 1. 개념 💡 현재상황에서 가장 좋은 것만 고르는 방법 (선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫓아 최종적인 해답에 도달) 이름에서 알 수 있듯이 어떠한 문제가 있을 때 단순 무식하게, 탐욕적으로 문제를 푸는 알고리즘이다. 여기서 탐욕적이라는 말은 ‘현재 상황에서 지금 당장 좋은 것만 고르는 방법’을 의미한다. 그리디 알고리즘을 이용하면 매 순간 가장 좋아보이는 것을 선택하며, 현재의 선택이 나중에 미칠 영향에 대해서는 고려하지 않는다. 다시 말해, 최적화 문제를 해결하는 알고리즘으로, 탐욕 알고리즘은 최적..