[알고리즘] 퀵 정렬 (Quick Sort) 이란? (C++로 구현하기)
2021. 3. 15. 21:01
Programming/알고리즘
퀵 정렬 (Quick Sort)이란? 이름부터가 퀵 정렬 (Quick Sort) 입니다. 빠르다는거겠죠? 맞습니다. 일반적인 상황에서 빠른 정렬 시간을 보장해준다고 합니다. 버블정렬, 삽입정렬, 선택정렬 등은 O(N²) 의 시간을 가지지만, 퀵 정렬은 평균적인 상황에서 O(N * log N) 의 시간을 가집니다. 그러므로 빠른 정렬이라고 할 수 있겠죠. 최악의 경우에서는 O(N²) 의 시간복잡도를 가집니다. 이 경우는 이미 정렬이 완료되어있는 경우로, 이런 경우에는 합병정렬을 사용하는 것을 고려해볼 수 있습니다. 동작 원리 아래와 같은 배열이 있다고 가정해보겠습니다. 퀵 정렬을 사용하기 위해서는 피벗 (Pivot) 이라는 기준점을 잡아주어야 합니다. 즉, 피벗을 기준으로 작은 것과 큰 것을 구분해서 정렬..
[알고리즘] 최대공약수 빠르게 찾기 - 유클리드 호제법
2020. 9. 1. 09:58
Programming/알고리즘
유클리드 호제법 (Euclidean Algorithm) 이란? 두 개의 자연수의 최대공약수(GCD) 를 빠르게 찾는 알고리즘이다. 유클리드 호제법이 유명한 또 다른 이유는, 이 방법이 인류 최초의 알고리즘이라고 소개되고 있기 때문이다. 최대공약수를 찾는 알고리즘은 여러가지가 있겠지만, 시간복잡도 면에서 가장 훌륭한 알고리즘이기 때문에 PS 과정에서 필요하다면 적극 활용하는 것을 추천한다. 계산 과정 유클리드 호제법은 매우 단순하다. 자연수 A, B가 있다고 가정하고, 다음과 같은 과정을 반복하기만 하면 된다. (1) A를 B로 모듈러 연산한다. (A % B) (2) 만약 나머지가 0이라면, B가 최대 공약수이다. (3) 만약 나머지가 0이 아니라면, A를 B로 바꾸고, B를 나머지로 바꾼다. 만약 A =..
[알고리즘] 효율적으로 약수를 찾는 알고리즘
2020. 8. 31. 23:20
Programming/알고리즘
코딩테스트 문제 중, 가끔 수학적인 기초를 묻는 문제에 약수, 배수 등의 문제가 출제된다. 이러한 유형의 문제를 접해본 경험이 없는 사람들은 최악의 시간복잡도를 갖는, 모든 경우를 찾는 순차적인 알고리즘으로 문제를 풀게 된다. 그러므로 PS를 준비하는 사람이라면 '모든 약수를 찾는 효율적인 알고리즘' 정도는 익혀두는 것이 좋다. 가장 단순하게 약수를 찾는 알고리즘 가장 단순한, 누구나 쉽게 생각할 수 있는 방법을 고안해보자. 만약 10의 약수를 찾는다고 했을 때, 1~10까지의 수 중에서, 10을 0으로 나누어 떨어지게 하는 수를 찾는 알고리즘을 생각할 수 있을 것이다. 10 % 1 = 0 10 % 2 = 0 10 % 3 = 1 10 % 4 = 2 10 % 5 = 0 10 % 6 = 4 10 % 7 = ..
[백준/2981] 검문 (약수 / 최대공약수)
2020. 8. 31. 21:42
Programming/백준 문제풀이
1. 문제 2. 접근 방법 '어떤 수가 가지고 있는 약수를 빠르게 찾는 알고리즘' 을 모르면 해결이 쉽지 않은 문제이다. 나도 이 알고리즘을 몰랐기 때문에, 처음에는 시간 초과를 겪어 당황스러울 수밖에 없었다. 이 문제를 접근하는 방법은 다음과 같다. (1) N개의 숫자를 대상으로, N - 1 만큼 숫자 간의 차이들을 구한다. (2) 이 N - 1개의 '차이'들 중, 가장 작은 값을 찾는다. (3) 위에서 구한 가장 작은 값을 대상으로, 1을 제외한 모든 약수를 구한다. (4) 위에서 구한 모든 약수 중, 전체 숫자를 나눠봤을 때 0으로 나누어 떨어지는 약수들만 출력한다. 예시를 들어보자. 다음과 같이 9, 23, 58 의 3개의 숫자가 있다고 가정해보겠다. 그렇다면 위와 같이, 3개의 숫자들의 차이는 ..
[백준 / 12015] 가장 긴 증가하는 부분 수열 2 (LIS) (이분 탐색)
2020. 8. 28. 22:53
카테고리 없음
1. 문제 2. 접근 방법 https://kbw1101.tistory.com/27 [백준/10816] 숫자 카드 2 (이분 탐색) 1. 문제 2. 접근 방법 이분 탐색 알고리즘으로 접근하되, 찾고자 하는 숫자가 시작하는 지점, 끝나는 지점을 찾아야 한다. 즉, 변형된 이분 탐색 알고리즘이라고 생각하면 된다. 찾고자 하는 숫자 kbw1101.tistory.com 위의 문제와 비슷하게, 이분 탐색을 응용한 알고리즘인 Lower Bound를 이용하여 푸는 문제이다. 여기에서 Lower Bound 의 의미는 다음과 같다. "찾고자 하는 수 이상의 값이 처음으로 등장하는 위치" 그렇다면 문제를 푸는 소개하겠다. 우선 LIS을 담을 배열을 만들고, 가장 첫 번째 원소의 값은 입력 배열의 첫 번째 원소와 동일하게 설..
[백준/12865] 평범한 배낭 (KnapSack 문제)
2020. 8. 3. 21:50
Programming/백준 문제풀이
1. 문제 2. 접근 방법 '알고리즘' 하면 빠질 수 없는 문제, '다이나믹 프로그래밍' 하면 빠질 수 없는 문제! 그 유명한 배낭 문제 (Knapsack Problem) 되시겠다. 나는 이 문제를 처음 접했을 때, 그러니까 대학교 3학년 시절에는 당연하게도 모든 경우의 수를 대입하는 무식한 방법을 택할 수 밖에 없었다. 그도 그럴 것이, 당시에는 DP의 개념도 몰랐었을 뿐더러 마땅한 해결책이 떠오르지 않았기 때문이다. 이렇게 문제를 풀었을 때는 각 물건 당 넣을지 안넣을지의 경우가 가능하므로, O(2^n) 이라는 어마어마한 시간 복잡도가 나오게 된다. 만약 물건이 100개라면 2의 100승이니까... 얼마나 무자비한 계산인지는 상상에 맡기겠다. 자! 그렇다면 본격적으로 다이나믹 프로그래밍의 개념을 적용..