정렬 18

백준] 2456 - 나는 학급회장이다(한국정보올림피아드:KOI 2011 지역본선)

시간 제한 : 1초메모리 제한 : 128MB 입력첫째 줄에는 반의 학생들의 수 N (3 b.three) return true; else if (a.three == b.three) { if (a.two > b.two) return true; else return false; } else return false; } } int main(void) { int n, tmp; cin >> n; vector arr(n, { 0,0,0,0,0 }); for (int i = 0; i < 4; i++) arr[i].idx = i; for (int i = 1; i tmp; if (tmp == 1) arr[j].one++; else if (tmp == 2) arr[j].two++; else arr[j].three++; ar..

백준] 6160 - Election Time(USACO 2008)

시간 제한 : 1초메모리 제한 : 128MB 입력Line 1: Two space-separated integers: N and KLines 2..N+1: Line i+1 contains two space-separated integers: A_i and B_i 출력Line 1: The index of the cow that is expected to win the election. 소스코드 #include #include #include using namespace std; struct cow { int first; int second; int originIdx; }; bool compare(const struct cow &a, const struct cow &b) { return a.first > b...

백준] 11728 - 배열 합치기

시간 제한 : 1.5초메모리 제한 : 256MB 입력첫째 줄에 배열 A의 크기 N, 배열 B의 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000,000)둘째 줄에는 배열 A의 내용이, 셋째 줄에는 배열 B의 내용이 주어진다. 배열에 들어있는 수는 절대값이 109보다 작거나 같은 정수이다. 출력첫째 줄에 두 배열을 합친 후 정렬한 결과를 출력한다. 소스코드 #include #include using namespace std; int main(void) { ios_base::sync_with_stdio(false); int m, n, idx1, idx2; cin >> n >> m; vector arr1(n), arr2(m), ans(n+m); for (int i = 0; i >..

백준] 2947 - 나무 조각(COCI 2008/2009)

시간 제한 : 1초메모리 제한 : 128MB 입력첫째 줄에 조각에 써 있는 수가 순서대로 주어진다. 숫자는 1보다 크거나 같고, 5보다 작거나 같으며, 중복되지 않는다. 처음 순서는 1, 2, 3, 4, 5가 아니다. 출력두 조각의 순서가 바뀔때 마다 조각의 순서를 출력한다. 소스코드 #include using namespace std; int main(void) { int arr[5]; for (int i = 0; i > arr[i]; for (int i = 0; i arr[j + 1]) { int tmp; tmp = arr[j]; arr[j] = arr[j + 1]; a..

백준] 1302 - 베스트셀러

시간 제한 : 2초메모리 제한 : 128MB 입력첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고, 알파벳 소문자로만 이루어져 있다. 출력첫째 줄에 가장 많이 팔린 책의 제목을 출력한다. 만약 가장 많이 팔린 책이 여러 개일 경우에는 사전 순으로 가장 앞서는 제목을 출력한다. 소스코드 #include #include #include #include using namespace std; struct book { string name; int sold; }; bool compare(const struct book a, const struct book b) {..

백준 알고리즘] 2399 - 거리의 차이

시간 제한 : 2초메모리 제한 : 128MB 문제수직선에 n개의 점이 찍혀 있다. 각각의 점의 x좌표가 주어졌을 때, n^2개의 모든 쌍에 대해서 거리의 차이를 더한 값을 구하는 프로그램을 작성하시오. 즉, 모든 i, j에 대해서 |x[i] - x[j]|의 합을 구하는 것이다. 입력첫째 줄에 n(1≤n≤10,000)이 주어진다. 다음 줄에는 x[1], x[2], x[3], …, x[n]이 주어진다. 각각은 0 이상 1,000,000,000 이하의 정수이다. 출력첫째 줄에 답을 출력한다. 소스코드 #include #include using namespace std; int main(void) { int n; long long *list, sum = 0; cin >> n; list = new long lon..

[C++] STL을 사용해 간편하게 알고리즘 문제 풀기

알고리즘 문제를 풀다 보면, 어떤 경우에는 데이터 처리에 앞서 정렬을 해야 하는 경우가 있다.그럴 때마다 정렬소스를 짜는 것이 비효율적일 뿐더러 정렬 이후 데이터 처리에 신경을 써줘야할 때문제의 시간복잡도를 고려해 퀵 정렬 등을 짜고 있는 건 생산적이지 못하다고 느꼈다.정렬에 대해 자세히 아는 건 좋지만, 그걸 실용적으로 활용하는 것도 중요하다는 이야기다. C언어를 주로 썼을 때는, qsort를 사용했다.(이부분에 대해서는 다른 포스팅에서 소개하겠다.) C++에서는 sort를 사용하면 빠른 시간 내에 정렬된 결과를 받을 수 있다.성능 측면에서는 다른 함수에 비해서는 준수한 수준이다. 이 성능에 대한 진 단순히 퀵 정렬만으로 구성한 정렬이 아니라 복합적으로 힙정렬, 삽입정렬도 섞여 있기 때문이다. 아래 사..

DataStructure,Algorithm] 힙정렬(HeapSort)

입력 받은 배열을 O(n)으로 히프 트리 구조로 생성할 수 있지만, 여기서는 일단 O(nlogn)으로 진행되는 히프트리 구성을 실시했다. (이 부분에 대해서는 차후 포스팅할 생각) 최대 히프트리를 구현했고, 최대 히프트리를 바탕으로 오름차순 정렬을 하는 코드다. 내림차순 정렬을 보고 싶다면, list 배열에 넣는 인덱스 순서만 바꿔주면 되고 공부 삼아 최소 히프트리를 구현하는 것도 나쁘지 않을 것이다. 숙련자가 보기에는 이 소스는 잘 짜여진 소스는 아니라는 것을 말해주고 싶다. 처음 자료구조를 배우던 시절 구조에 대해서만 깨우치고 만든 소스라서, 불필요한 메모리 할당도 있고 히프 트리 구성에서 시간 복잡도 손실을 보기는 하지만, 히프트리를 바탕으로 힙정렬(혹은 히프정렬)을 구현하는 것까지는 문제되지 않아..

Algorithm] 비교 정렬의 하한

항상 고민하던 게 있다.비교 정렬의 하한이 nlogn이며 이보다 더 좋은 정렬 알고리즘은 없다는 이야기를 들었다.도대체 왜 그런 것인지, 어째서 그런 것인지에 대해서 잘 모르고 넘어갔다.주어진 문제에 대해서 시간 복잡도의 하한이라는 것은어떤 문제도 이 하한보다 빠르게 구할 수 없다는 것을 의미하는데,이 하한이 알고리즘에 대한 시간 복잡도가 아니라이 문제의 고유 특성으로 인해서 과거부터 지금까지, 혹은 미래에 만들어진어떤 효율적인 알고리즘이더라도 적어도 하한의 시간복잡도 만큼 걸린다는 것을 의미한다. n개의 숫자가 저장된 배열이 있다고 하자.여기서 최솟값을 찾는 문제의 하한은 최소한 n-1회의 비교가 필요하므로 n-1이다.이런 식으로 n개의 수를 비교 정렬할 때 필요한 최소 비교 횟수가 어떻게 되는지 생각..