본문 바로가기

CS/Algorithm11

[이취코] Chapter 04. 구현 * 해당 게시글은 [이것이 취업을 위한 코딩테스트다, 나동빈] 교재를 학습하고 정리한 글입니다. 1. 구현 유형 완전 탐색시뮬레이션 모든 경우의 수를 전부 다 계산하는 방식 문제에서 제시한 알고리즘을 한 단계씩 차례대로 수행하는 방식 2. 구현 시 고려해야 할 제약 사항2.1. 자료형의 범위정수형자료형 크기자료형 범위int4byte-2,147,483,648 ~ 2,147,483,647long long8byte-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 2.2. 채점 시스템대부분의 코딩 테스트 환경에서는 아래의 채점 시스템 환경이 주어진다.시간 제한 : 1초메모리 제한 : 128MB 3. 예제#include using namespace std;.. 2025. 1. 6.
[이취코] Chapter 03. 그리디 * 해당 게시글은 [이것이 취업을 위한 코딩테스트다, 나동빈] 교재를 학습하고 정리한 글입니다. 1. 그리디 알고리즘현재 상황에서 지금 가장 좋은 것을 골라나가는 방법현재의 선택이 나중에 미칠 영향은 고려하지 않음예) 다익스트라 알고리즘, 크루스칼 알고리즘 2. 언제 사용할까?문제를 보고 현재 상황에서 가장 좋아보이는 것을 선택할 때 문제가 풀릴 지를 파악할 수 있어야 함그리디로 판단할 때는 정당한지(= 다른 방법이 불가능한 지) 검토할 수 있어야 함 '가장 큰 순서대로', '가장 작은 순서대로' 와 같은 기준을 알게 모르게 제시해주는 편정렬 알고리즘과 함께 결함된 문제가 많음 3. 예제#include using namespace std;int coins[4] = {500, 100, 50, 10};int.. 2024. 10. 31.
DFS와 BFS : (2) 구현하기 1.  DFS 구현1-1.  DFS 과정더이상 이어진 유효 노드가 없는 절벽 끝까지 쭉 탐색한다. 이때, 절벽 끝에 도달하고 나면, 스택에서 하나씩 다시 버리면서 왔던 길을 돌아가서 다른 길로 접어든다. 이후 탐색 반복  1-2.  DFS 구현 코드1)  재귀함수 이용#include #include #include #include using namespace std;void dfs(int start, vector graph[], bool check[]) { check[start] = true; while(!st.empty()) { int current = st.top(); // 가장 최근에 스택 들어와있던 노드 current st.pop(); .. 2022. 8. 28.
DFS와 BFS : (1) 기초 1. DFS, BFS ?그래프란, 정점(node)과 간선(edge)로 이루어진 자료구조이다. 이때, 우리는 그래프를 탐색함으로써 모든 정점을 한번씩 방문할 수 있다.이러한 그래프 탐색 방법에는 깊이 우선 탐색과 너비 우선 탐색이 있다.  DFS (Depth-First Search)BFS (Breadth-First Search)깊이 우선 탐색너비 우선 탐색위 → 아래로 최대한 많이 내려간 다음, 더 이상 갈 수 없을 때 옆으로 이동왼쪽 → 오른쪽으로 최대한 많이 옆으로 간 다음, 더 이상 갈 수 없을 때 아래로 이동스택 or 재귀함수  +  노드 방문 여부 배열큐 +  노드 방문 여부 배열BFS보다 간단하지만, 탐색 속도 느림DFS보다 복잡하지만, 탐색 속도 빠름   2.  DFS, BFS  활용 가능한 .. 2022. 8. 28.
기수 정렬 (Radix Sort) 1. 기수 정렬 Queue를 이용해서 각 자리수 별로 정렬 반복 ※ 기 (radix) : 특정 진수를 나타내는 숫자들 ex ) 10진수의 radix : 0, 1, 2, 3, ....., 8, 9 2진수의 radix : 0, 1 2. 기수 정렬 예제 ex ) 89, 70, 35, 131, 910 오름차순 정리하시오. 2022. 6. 11.
쉘 정렬 (Shell Sort) 1. 쉘 정렬 간격(gap)을 이용해서 굵직굵직한 삽입정렬을 하자 ※ 삽입정렬은 어느 정도 이미 정렬된 배열에서 효과적 ∴ 1. 간격을 이용해서 굵직굵직한 그룹별 삽입 정렬을 한다. (큰 숫자들 대충 뒤로, 작은 숫자들 대충 앞으로) 2. 큰 틀에서 어느정도 정렬이 된 상태가 된다. 3. 이후에 정석 삽입정렬을 해서 완벽히 정렬 ※ gap 전체 원소 수의 1/2 → 이전 gap의 1/2 → 이전 gap의 1/2 → ...... → 1 2. 쉘 정렬 예제 ex ) 30 60 90 10 40 80 40 20 10 60 50 30 40 90 80 오름차순 정리하시오. #include void shellSort(int arr[], int len) { for(int h=len/2 ; h>0 ; h/=2) { fo.. 2022. 6. 6.
퀵 정렬 (Quick Sort) 1. 퀵 정렬▶ 분할정복 알고리즘input 배열을 반복적으로 분할해서 계산하는 알고리즘이며,  평균 시간복잡도가 O(N*logN) 특정한 값 a을 기준으로 a보다 큰 수, a보다 작은 수를 나누자 ! ※ 특정한 값 a = pivot※ 일반적으로 첫번째 원소를 pivot 값으로 설정한다.   2. 퀵 정렬 예제ex )  3  7  8  1  5  9  6  10  2  4  오름차순 정리하시오. #include int number = 10;int data[10] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 };void show() { for (int i = 0; i = end) { // 원소가 1개인 경우 return; } int key = start; // k.. 2022. 5. 9.
삽입 정렬 (Insertion Sort) 1. 삽입 정렬 각 숫자를 적절한 위치에 삽입하자 ! ※ 한번 수행할 때마다 [앞] 정렬된 부분의 원소 수가 1개 증가, [뒤] 정렬 안된 부분의 원소 수는 1개 감소됨 반복해서 수행하면 결국 [뒤] 정렬 안된 부분에는 아무 원소도 남지 않고 모두 정렬됨 ※ 선택/버블 vs. 삽입 ▶ 선택, 버블: 이미 알맞게 정렬되어 있더라도 차례가 되면 정렬당함 (위치 바꾸는 과정 거침) : 비효율적 ▶ 삽입: 필요할때만 위치를 바꿈 : 효율적 이번 주자 앞에 있는 애들은 다 이미 알맞은 위치에 정렬되어 있는 상태이므로 다시 정렬할 필요 없음 2. 삽입 정렬 예제 ex ) 1 10 5 8 7 6 4 3 2 9 오름차순 정리하시오. #include int main(void) { int a[] = { 1, 10, 5, .. 2022. 5. 6.
버블 정렬 (Bubble Sort) 1. 버블 정렬 2개씩 비교해서 더 작은 것을 앞으로 자리바꿈 * 세로로 그려 보면, 가장 작은 것이 거품처럼 위로 (=맨 앞으로) 올라가는 형태 [ Algorithm ] 1. for pass = 1 to n-1 2. for i = 1 to n-pass 3. if (A[i-1] > A[i]) // 위의 원소가 아래의 원소보다 크면 4. A[i-1] ↔ A[i] // 자리바꿈 5. return A 2. 버블 정렬 예제 ex ) 1 10 5 8 7 6 4 3 2 9 오름차순 정리하시오. #include int main(void) { int a[] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 }; int n = sizeof(a) / sizeof(int); int temp; for (int i .. 2022. 5. 4.