728x90

전체 글 50

[알고리즘] 신장 트리 - 크루스칼 알고리즘 (Spanning Tree - Kruskal Algorithm)

신장 트리는 하나의 그래프가 있을 때 모든 노드를 포함하는 부분 그래프를 의미한다. 크루스칼 알고리즘은 가능한 최소 비용의 신장 트리를 찾아주는 알고리즘이다. 간선을 정렬한 뒤에 간선의 비용이 작은 순서대로 차례대로 최소 신장 트리를 만들어 가는 그리디 알고리즘의 일종이다. 신장 트리 신장 트리는 그래프 알고리즘 문제로 자주 출제되는 문제 유형이다. 기본적으로 신장 트리란 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미한다. 크루스칼 알고리즘 우리는 다양한 문제 상황에서 가능한 한 최소한의 비용으로 신장 트리를 찾아야 할 때가 있다. 이처럼 신장 트리 중에서 최소 비용으로 만들 수 있는 신장 트리를 찾는 알고리즘을 '최소 신장 트리 알고리즘'이라고 한다. 대표적..

개발/알고리즘 2021.10.27

[알고리즘] 서로소 집합 (Disjoint Sets Algorithm)

서로소 집합은 공통 원소가 없는 두 집합이다. 서로소 집합 알고리즘은 union-find 연산으로 구성되며, 모든 노드는 자신이 속한 집합을 찾을 때 루트 노드를 재귀적으로 찾는다. 서로소 집합 수학에서 서로소 집합이란 공통 원소가 없는 두 집합을 의미한다. 서로소 집합 자료구조란 서로소 부분 집합들로 나누어진 원소들의 데이터를 처리하기 위한 자료구조라고 할 수 있다. 서로소 집합 자료구조는 union과 find 2개의 연산으로 조작할 수 있다. union(합집합) 연산은 2개의 원소가 포함된 집합을 하나의 집합을 합치는 연산이다. find(찾기) 연산은 특정한 원소가 속한 집합이 어떤 집합인지 알려주는 연산이다. 서로소 집합 자료구조는 union-find(합치기 찾기) 자료구조라고 불기기도 한다. 서로..

개발/알고리즘 2021.10.26

[Java] 자바 String, StringBuffer, StringBuilder 차이

String String 클래스는 변경 불가능한(immutable) 클래스이기 때문에 한번 생성된 String 인스턴스는 변경할 수 없다. '+' 연산자를 이용해서 문자열을 결합할 때 인스턴스 내의 문자열이 바뀌는 것이 아니고 합쳐진 새로운 문자열이 담긴 String 인스턴스가 생성된다. 따라서 String 클래스에서의 문자열 결합은 연산할 때마다 새로운 문자열을 가진 인스턴스를 생성시키므로 메모리 공간과 메모리 할당 및 해제에 의해 성능이 낭비된다. 문자열간의 결합이나 추출 등 문자열을 다루는 작업이 많아진다면 StringBuffer 클래스나 StringBuilder 클래스를 사용하는 게 유리할 것이다. StringBuffer String과 StringBuffer의 가장 큰 차이는 문자열의 내용을 변경..

개발/Java 2021.10.24

[알고리즘] 다익스트라 / 플로이드 워셜 - 최단 경로 알고리즘 (Dijkstra / Floyd Warshall - Shortest Path Algorithm)

다익스트라 알고리즘은 한 지점에서 다른 모든 지점까지의 최단 경로를 계산하는 알고리즘이다. 플로이드 워셜 알고리즘은 모든 지점에서 다른 모든 지점까지의 최단 경로를 계산하는 알고리즘이다. 다익스트라의 시간 복잡도는 간단하게 구현하면 O(V²)이고 개선된 방법은 O(ElogV)이다. 플로이드 워셜의 시간 복잡도는 O(V³)이다. 최단 경로 알고리즘은 말 그대로 가장 짧은 경로를 찾는 알고리즘이다. 그래서 '길 찾기' 문제라고도 불린다. 최단 경로 알고리즘 유형에는 다양한 종류가 있는데, 상황에 맞는 효율적인 알고리즘이 이미 정립되어 있다. 최단 경로 문제는 보통 그래프를 이용해 표현하는데 각 지점은 그래프에서 '노드'로 표현되고, 지점 간 연결된 도로는 그래프에서 '간선'으로 표현된다. 컴퓨터공학과 학부 ..

개발/알고리즘 2021.10.23

[알고리즘] 다이나믹 프로그래밍 (동적 계획법) (Dynamic Programming)

연산 속도와 메모리 공간을 최대한으로 활용할 수 있는 효율적인 알고리즘을 작성해야 한다. 메모이제이션은 다이나믹 프로그래밍을 구현하는 방법 중 한 종류로, 한 번 구한 결과를 메모리 공간에 메모해두고 같은 식을 다시 호출하면 메모한 결과를 그대로 가져오는 기법을 의미한다. 다이나믹 프로그래밍이란 큰 문제를 작게 나누고, 같은 문제라면 한 번씩만 풀어 문제를 효율적으로 해결하는 알고리즘 기법이다. 가능하다면 재귀 함수를 이용하는 탑다운 방식보다는 보텀업 방식으로 구현하는 것을 권장한다. 다이나믹 프로그래밍 컴퓨터의 연산 속도에 한계가 있고, 메모리 공간을 사용할 수 있는 데이터의 개수도 한정적이라는 점이 많은 제약을 발생시킨다. 그래서 우리는 연산 속도와 메모리 공간을 최대한으로 활용할 수 있는 효율적인 ..

개발/알고리즘 2021.10.22

[알고리즘] 이진 탐색 (Binary Search)

순차 탐색이란 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법이다. 이진 탐색은 위치를 나타내는 변수 3개를 사용하는데 탐색하고자 하는 범위의 시작점, 끝점, 그리고 중간점이다. 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는 게 이진 탐색 과정이다. 이진 탐색 문제는 입력 데이터가 많거나, 탐색 범위가 매우 넓은 편이다. 예를 들어 데이터의 개수가 1,000만 개를 넘어가거나 탐색 범위의 크기가 1,000억 이상이라면 이진 탐색 알고리즘을 의심해보자. 입력 데이터가 많은 문제는 sys 라이브러리의 readline() 함수를 이용하면 시간 초과를 피할 수 있다. 순차 탐색 이진 탐색에 대해 알아보기 전에 가장 기본 탐색..

개발/알고리즘 2021.10.21

[알고리즘] 선택, 삽입, 퀵, 계수 정렬 (Selection, Insertion, Quick, Count sort)

정렬이란 데이터를 특정한 기준에 따라서 순서대로 나열하는 것이다. 선택 정렬은 매번 가장 작은 것을 '선택'하여 앞으로 보내면서 정렬하는 알고리즘이다. 선택 정렬의 시간 복잡도는 O(N²)이다. 파이썬 기본 정렬 라이브러리의 수행 시간이 상당히 빠르다. 삽입 정렬은 특정한 데이터를 적절한 위치에 '삽입'하며 정렬하는 알고리즘이다. 삽입 정렬의 시간 복잡도는 O(N²)인데 리스트의 데이터가 거의 정렬되어 있는 상태라면 최선의 경우 O(N)의 시간 복잡도를 가진다. 따라서 거의 정렬되어 있는 상태의 데이터라면 다른 알고리즘보다 삽입 정렬을 이용하는 것이 유리하다. 퀵 정렬은 기준을 설정한 다음 큰 수와 작은 수를 교환한 후 리스트를 반으로 나누는 방식으로 동작한다. 퀵 정렬은 평균적으로 시간 복잡도가 O(l..

개발/알고리즘 2021.10.20

[알고리즘] 깊이 우선 탐색 / 너비 우선 탐색 (DFS / BFS Algorithm)

스택은 선입후출 구조 또는 후입선출 구조라고 함 큐는 선입선출 구조라고 함 재귀 함수란 자기 자신을 호출하는 함수이다 DFS는 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘이다 BFS는 가까운 노드부터 탐색하는 알고리즘이다 DFS - 스택의 동작 원리, 재귀 함수 이용하여 구현 BFS - 큐의 동작 원리, 큐 자료구조 이용하여 구현 자료구조 기초 탐색이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 의미한다. 프로그래밍에서는 그래프, 트리 등의 자료구조 안에서 탐색을 하는 문제를 자주 다룬다. 대표적인 탐색 알고리즘으로 DFS와 BFS를 꼽을 수 있다. DFS와 BFS를 제대로 이해하려면 기본 자료구조인 스택과 큐에 대한 이해가 전제되어야 한다. 자료구조란 '데이터를 표현하고 관리하고 처리..

개발/알고리즘 2021.10.19

[알고리즘] 구현 알고리즘 (Implementation Algorithm)

구현 문제 유형은 모든 범위의 코딩 테스트 문제 유형을 포함하는 개념 프로그래밍 언어의 문법을 정확히 알고 있어야 함 라이브러리 사용 경험을 늘려야 함 파이썬의 경우 자료형의 표현 범위 제한에 대해 깊게 생각하지 않아도 되지만 실수형 변수는 유효숫자에 따라서 연산 결과가 원하는 값이 나오지 않을 수 있음 크기가 1,000만 이상인 리스트가 있다면 메모리 용량 제한으로 문제를 풀 수 없게 되는 경우도 있음 일반적인 기업 코딩 테스트 환경에서는 파이썬으로 제출한 코드가 1초에 2,000만 번의 연산을 수행한다고 가정하면 크게 무리가 없음 알고리즘 문제를 풀 때는 시간제한과 데이터의 개수를 먼저 확인한 뒤에 이 문제를 어느 정도의 시간 복잡도의 알고리즘으로 작성해야 풀 수 있을 것인지 예측할 수 있어야 함 코..

개발/알고리즘 2021.10.18

[알고리즘] 그리디(탐욕) 알고리즘 (Greedy Algorithm)

현재 상황에서 지금 당장 좋은 것만 고르는 방법 (매 순간 좋아 보이는 것을 선택) 사전에 외우고 있지 않아도 풀 수 있을 가능성이 높은 문제 유형 창의력, 즉 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구 정렬 알고리즘과 짝을 이룸 대부분의 문제는 그리디 알고리즘을 이용했을 때 '최적의 해'를 찾지 못함 문제 풀이를 위한 최소한의 아이디어를 떠올리고 그것이 정당한지 검토할 수 있어야 함 그리디 알고리즘은 단순하지만 강력한 문제 해결 방법이다. 탐욕법으로 불리기도 한다. 이름에서 알 수 있듯이 어떠한 문제가 있을 때 단순 무식하게, 탐욕적으로 문제를 푸는 알고리즘이다. 여기서 탐욕적이라는 말은 '현재 상황에서 지금 당장 좋은 것만 고르는 방법'을 의미한다. 그리디 알고리즘을 이용하면 ..

개발/알고리즘 2021.10.17
728x90