본문 바로가기

Algorithm/Algorithm Logic

(9)
가장 긴 증가하는 부분 수열 (Longest Increase Sequence) 안녕하세요. 이번 포스팅에서는 가장 긴 증가하는 부분 수열문제를 해결해 보도록 하겠습니다. 우선 가장 기본적인 포맷은 다음과 같습니다. https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 이 문제를 dp로 해결할 수도 있는데, 이번 포스팅에서는 dp를 사용하지 않고 풀어보도록 하겠습니다. #include using namespace std; int n, res; int ..
[Algorithm] DFS, BFS 정리 안녕하세요. 이번 포스팅에서는 코딩 테스트의 단골 주제라 할 수 있는 DFS, BFS를 정리해보는 시간을 갖도록 하겠습니다. DFS, BFS는 그래프 탐색 알고리즘의 일종입니다. 그래프란 정점들과 그 정점들을 연결하는 간선으로 이루어진 자료구조입니다. 1. 깊이 우선 탐색, DFS (Depth First Search) 한 정점으로부터 시작하여 리프 노드(더 이상 갈 수 있는 연결된 노드가 없는 노드)까지 탐색을 한 뒤, 최초의 갈림길을 만날 때까지 역행하여 다른 길을 탐색합니다. 위와 같은 그래프가 있다고 해보겠습니다. 깊이 우선 탐색, 너비 우선 탐색은 기본적으로 탐색입니다. 즉 모든 노드를 탐색하는 것에 가장 큰 의의가 있습니다. 따라서 왼쪽부터 갈지, 오른쪽부터 갈지 즉 어떠한 노드를 시작으로 다음..
[C++/Algorithm] 투 포인터, 구간 합 이해하기 만약에 문제에서 연속된 데이터 구간을 처리하기를 원한다면 투 포인터 혹은 구간 합을 활용하여 O(n)의 시간 복잡도로 해결할 수 있습니다. 1. 투 포인터 {1, 2, 3, 2, 5} 의 배열이 있고, 연속된 수열의 합이 5인 수열의 개수를 묻는 문제가 있을 수 있습니다. 이러한 문제는 시간에 제한이 없다면 간단하게 for 루프를 중첩시켜 O(n^2)에 해결하는 방법이 있을 수 있습니다. 하지만 인풋 사이즈와 시간 제한으로 인해 O(n^2)의 알고리즘을 사용할 수 없는 경우라면 어떻게 해야 할까요? 그림과 같이 첫 점을 가리키는 두개의 포인터를 선언했다고 가정해 볼게요. 이 상태에서 합이 5 이상이 될 때까지 sum이라는 변수에 값들을 더해주며 End pointer를 우측으로 이동하여 줍니다. 자 Sum..
[C++/Algorithm] 정렬 알고리즘 이해하고 구현하기 (Merge, Quick) #2 안녕하세요. 이번에는 저번 포스팅에 이어 https://chanho0912.tistory.com/21 [C++/Algorithm] 정렬 알고리즘 이해하고 구현하기 (bubble, insertion, selection) #1 안녕하세요. 이번 포스팅에서는 기본적인 정렬 알고리즘인 버블 정렬 선택 정렬 삽입 정렬 이 세 가지에 대해 이해하고 구현해보는 포스팅을 진행해볼 예정입니다. 우선 정렬 알고리즘이 무엇 chanho0912.tistory.com Merge Sort와 Quick Sort에 대해 알아보는 시간을 가져보겠습니다. 기본적으로 위 포스팅에서 진행한 선택, 삽입, 버블 정렬은 WorstCase(최악의 경우) O(n^2)의 성능을 가집니다. 즉 우리가 처리해야 할 데이터의 개수가 n 개라고 가정하면,..
[C++/Algorithm] 정렬 알고리즘 이해하고 구현하기 (bubble, insertion, selection) #1 안녕하세요. 이번 포스팅에서는 기본적인 정렬 알고리즘인 버블 정렬 선택 정렬 삽입 정렬 이 세 가지에 대해 이해하고 구현해보는 포스팅을 진행해볼 예정입니다. 우선 정렬 알고리즘이 무엇인가에 대해 한번 짚고 넘어갈게요. 정렬 알고리즘이란? 컴퓨터 과학과 수학에서 정렬 알고리즘(sorting algorithm)이란 원소들을 번호순이나 사전 순서와 같이 일정한 순서대로 열거하는 알고리즘이다. (출처 : https://ko.wikipedia.org/wiki/%EC%A0%95%EB%A0%AC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98) 즉 저희가 사용하는 List나 Array 또는 다른 자료구조의 데이터를 저희가 원하는 순서대로 배열하는 알고리즘입니다. 정렬 알고리즘은 데이터의 정규화를 위..
[C++/Algorithm] 순열과 조합 구현하기 이번 포스팅에서는 C++로 순열과 조합을 구현해보려 한다. 1. 순열 순열은 '순서'의 개념이 존재하는 조합이다 가령 [1, 2, 3] 중 3개의 원소로 만들 수 있는 모든 순열의 집합은 [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1] 이렇게 6개의 순열이 나올 수 있고, 간단하게 3!로 그 수를 구할 수 있다. 컴퓨터로 순열을 구현하는 방법에는 몇 가지가 있는데, 가장 기본적으로 DFS 방식, 즉 재귀적으로 방문처리를 이용하여 순열을 구할 수 있다. // Permutation DFS로 구현 #include using namespace std; void Permutation(int visited[3], vector & vec, vecto..
[C++/Algorithm] upper_bound, lower_bound 이해하기 2021년 상반기 카카오 인턴 코딩 테스트에 응시했었는데, 당시 3번 문제에 upper_bound, lower_bound를 사용했었다. 그 당시에 조금 헤맸던 기억이 있어서 이번 기회에 한번 정리해보려 한다. 우선 c++ reference(https://www.cplusplus.com/reference/algorithm/upper_bound/)를 찾아보면 Return iterator to upper bound Returns an iterator pointing to the first element in the range [first,last) which compares greater than val. The elements are compared using operator
[C++/Algorithm] priority_queue 사용법 Queue라는 자료구조는 선입 선출, 즉 먼저 들어온 data가 먼저 나가는 구조로 되어있다. PriorityQueue라는 자료구조는 이 Queue라는 자료구조의 입 출력 순서를 지키면서, Queue에 내장되어 있는 data는 자동적으로 정렬이 되어있게끔 만들어 주는 자료구조이다. 즉 선입선출 + 자동정렬이라고 간단하게 생각하면 된다. 이 PriorityQueue를 C++ stl library로 사용하려면 #include #include 위의 라이브러리를 포함하거나, queue library를 포함해주면 사용할 수 있다. 기본적인 선언부는 다음과 같다. // priority_queue 다음과 같은 간단한 코드로 예시를 들어보겠다. #include using namespace std; int main(){..