목록알고리즘 (20)
직대딩 블로그
#include int inter_search(int a[], int n, int key) { int l, r, m; l = 0, r = n - 1; while (l a[m]) l = m + 1; else if (key < a[m]) r = m - 1; else return m; } return -1; } void main() { int key, find, count; scanf("%d", &key); int array[] = { 5,7,12,15,20,22,25,27,30,32 }; count = sizeof(array) / sizeof(int); find = inter_search(array, count, key); if (find < 0) printf("찾고자 하는 값이 없다"); else prin..

구조체 사용 #include #include struct NODE { int data; NODE *left; NODE *right; }; NODE *INSERT(NODE *head, int value) { NODE *index = head; NODE *position = NULL; while (index != NULL) { position = index; if (value data) index = index->left; else if (value > index->data) index = index->right; else return NULL; } NODE *newnode = (NODE *)malloc(sizeof(NODE)); if (newnode == NULL) return NULL; ..
https://www.acmicpc.net/problem/1874 1874번: 스택 수열 1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다. www.acmicpc.net stack 의 push/pop 연산을 이용해 입력받은 수열의 순서 재배치 가능 여부를 확인하면 된다. #include #include #include using namespace std; int main() { int n = 0, m = 0; int a[100005]; stack stk; vector vec; cin..
https://www.acmicpc.net/problem/10799 10799번: 쇠막대기 여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저 www.acmicpc.net 입력받은 string 의 크기만큼 반복문을 돌면서, 여는 괄호는 스택에 쌓아준다. 닫는 괄호가 나왔을 때, 바로 앞이 여는 괄호였을 경우 ans 변수에 스택의 사이즈만큼 더해준다. 아닐 경우 index가 1 이상 차이나는 것이므로 ans 변수를 1 증가시켜준다. #include #include #include using namespace std; int main() { int ans = 0; string s..
https://www.acmicpc.net/problem/10845 10845번: 큐 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 www.acmicpc.net #include #include #include using namespace std; queue que; int n, k; string str; int main() { cin >> n; for (int i = 0; i > str; if (str == "push") { cin >> k; que.push(k); } else if (str == "pop")..
https://www.acmicpc.net/problem/17427 17427번: 약수의 합 2 두 자연수 A와 B가 있을 때, A = BC를 만족하는 자연수 C를 A의 약수라고 한다. 예를 들어, 2의 약수는 1, 2가 있고, 24의 약수는 1, 2, 3, 4, 6, 8, 12, 24가 있다. 자연수 A의 약수의 합은 A의 모든 약수를 더 www.acmicpc.net #include using namespace std; int main() { int n; long long ans=0; cin >> n; for(int i=1;i
https://www.acmicpc.net/problem/10159 10159번: 저울 첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩 www.acmicpc.net 양방향 DFS 알고리즘으로 해결했다. 먼저 a b 로 가는 경로가 존재하는 것으로 생각한다. 수학에서 ac 라는 것이다. 즉, 물건 a,b의 비교 결과를 알아내라는 문제를 a->b 로 가는 경로 혹은 b->a로 가는 경로가 있는지 측정하는 것으로 바꿔 생각한다. 원래는 이를 토대로 플로이드 와샬 알고리즘으로 해결하면 되지만 양방향으로 DFS를 돌리며 둘 다..
https://www.acmicpc.net/problem/20366 20366번: 같이 눈사람 만들래? 높이가 (2, 5), (3, 5)로 구성된 눈사람 둘을 만드는 것이 최적의 경우 중 하나이다. |7-8| = 1 다른 경우로는 (2, 9), (5, 5)로 두 눈사람을 만드는 경우가 있다. |11-10| = 1 www.acmicpc.net 정렬 후 투포인터를 이용한다. #include #include #include using namespace std; int main() { int n; int ans = 1e9; cin >> n; vector vec(n); for(int i = 0; i > vec[i]; sort(vec.begin(), vec.end()); for(int i..
https://www.acmicpc.net/problem/6588 6588번: 골드바흐의 추측 각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰 www.acmicpc.net 두 홀수 소수의 합으로 n을 나타낼 수 없는 경우에는 "Goldbach's conjecture is wrong." 을 출력하라고 문제에 나와있는데 그럴 필요없다. 왜냐면 문제에서 주어진 n의 범위는 6 ≤ n ≤ 1000000 이고, 골드바흐의 추측은 이미 10의 18제곱 까지 증명되었기 때문이다. 그러므로 그냥 에라토네스의 체를 이용하여 ~n 까지의 소수의 개수를 미리..
문제 링크 : https://www.acmicpc.net/problem/2531 2531번: 회전 초밥 첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤ www.acmicpc.net 회전 초밥의 범위를 나타내는 배열을 하나 만들어주고, 어떤걸 먹었는지 반복문을 통해 표시해주면 된다. #include #include int n, d, k, c, cnt; int a[33005], vst[33005]; void ins(int go) { if (!vst[go]) cnt++; vst[go]++; } void del(int go) {..