본문 바로가기

Algorithms/simulation90

6 Problem A : 개미마을3 개미집 한 가구에 1~9마리의 개미가 살고 있고, 이동하는 거리는 마리수와 상관없이, 한 가구가 이동하는 거리만 합산하면 된다 각 개미들의 전체 이동거리를 최소로 하여 모든 대피소에 정원이 초과되지 않도록 대피시키는 프로그램을 작성 - 한 층에 대해서 받아서 - 대피소 위치가 3개 이므로 1, 2번의 가운데와 2, 3번의 가운데로 나누어 - 가까운 대피소로 일단 대피시킨다 - 합산을 해서 정원을 초과하는 대피소가 있다면 - 각 마리당 이동 비용을 계산하여 - radix sort를 사용하여 비용기준에 따라 정렬한다 - 그리고 비용이 작은 것부터 초과되지 않도록 이동시킨다 - 마지막에 이동한 후에 다시 수용 가능한 마리를 가진 가구를 이동시킨 후 종료 /// === main.cpp === #include #.. 2019. 11. 12.
5 Problem A : 지하철 목적 역까지 가는데 걸리는 최소 시간과 최단 경로를 출력 - 플로이드 와샬 N^3 - 다익스트라 대개 N^2 다익스트라 풀이 - D[] : 시작 점으로 인덱스까지의 최단 거리 저장 배열 - P[] : 값에서 인덱스까지 가는데 최단 거리를 가진 노드 - chk[] : 확정적으로 가장 짧은 거리 1로 변경 #include #define LN 11000 #define MAX 10 int N, M, S[MAX][MAX], D[MAX], P[MAX], chk[MAX]; // S는 입력 받는 행렬, D는 최단 거리 저장, P는 void path(int pos) { if (pos == 0) return; path(P[pos]); printf("%d ", pos); } int main(){ int i, j, k, mi.. 2019. 11. 8.
2 Problem E : 구간 성분 두 문자열에서 같은 성분을 가진 구간 중에서 가장 긴 구간을 찾아, 그 구간의 길이를 출력하는 프로그램 - 해싱 - 정적 할당 - 해싱 키 값을 만드는 과정 - 완전 탐색에서, 해싱 키 값을 규칙에 의해서 만들어 냄 #include #include #define MOD 10000 char A[1510], B[1510]; int asum[1510], bsum[1510], alen, blen, bn; struct data { int pos; data *next; data *myAlloc(int _pos, data *_next) { pos = _pos, next = _next; return this; } } *hash[MOD], buf[1510]; void push(int key, int pos) { hash.. 2019. 11. 7.
2 Problem D : 키로거(Keylogger) 메모장에서 커서 문제로, >, next = next; next->prev = prev; } } *head, *tail, *cur, buf[1000005]; int bn; void push(char ch) { data *pr = cur->prev; pr->next = cur->prev = buf[bn++].myAlloc(ch, pr, cur); } int main() { int T; scanf("%d", &T); // 테스트케이스 갯수 입력받고 head = buf[0].myAlloc(0, 0, 0); // head 와 tail = buf[1].myAlloc(0, 0, 0); // tail 을 만듬 while (T--) { bn = 2; head->next = tail; // 연결 tail->prev = h.. 2019. 11. 7.
2 Problem C : 용액 슬라이딩 윈도우 - 양 쪽에서 하나씩 이동 - 이동하면서 비교하는 과정 와일 문 안에 - break 조건을 넣기 #include int N, arr[100010], ans = 2e9 + 1, ans1, ans2; //입력 받는 배열, int Abs(int x) { return x >= 0 ? x : -x; } // 절대 값 int main() { scanf("%d", &N); for (int i = 0; i < N; i++) scanf("%d", &arr[i]); // 입력을 받고 int l = 0, r = N - 1, tmp; while (l < r) { tmp = arr[l] + arr[r]; if (Abs(tmp) < ans) { // 0과의 거리 이므로, 절대값을 한 후 비교 ans = Abs(t.. 2019. 11. 7.
2 Problem A : 수열 정수의 숫자와 연속 부분합의 길이가 주어진다 연속된 숫자의 합이 최대가 되는 값을 출력한다 간단한 방법으로 풀어서(naive) 정답을 도출하고, 더 간단한 방법이 없는지 확인한다 - 구간 합 구하기 - 누적 합 구하기 - 범위 설정해서 원하는 값 도출 #include int N, K, arr[100100], ans = -10000000; // arr 존재 int main() { scanf("%d %d", &N, &K); for (int i = 1; i 2019. 11. 7.
1 Problem F : 연속부분합 찾기 N개의 정수를 담고 있는 배열에서, 가능한 연속 부분합을 구하는 프로그램을 작성하라 입력에 대한 가장 큰 연속 부분합을 출력한다 #include int N, arr[100005], ans; int Max(int x, int y) { return x > y ? x : y; } // MAX 함수 int main() { scanf("%d", &N); // 숫자를 입력 받고 for (int i = 1; i 0) arr[i] += arr[i - 1]; // 양수이면 누적값을 저장함 ans = Max(ans, arr[i]); // 가장 큰 수를 저장함 } printf("%d\n", ans); return 0; } 4 1 2 -2 4 10 3 -4 0 1 7 -4 13 -9 8 -3 5 17 2019. 11. 7.
1 Problem B : 못생긴 수 소인수분해 했을 경우 나오는 소인수가 2, 3 그리고 5뿐인 수를 이야기 수열로 늘어 놓으면 1, 2, 3, 4, 5, ,6, 8, 9, 10, 12, ... 정수 n이 주어졌을 때, n번째 못생긴 수를 출력하는 프로그램을 작성하시오 - heap을 만들어서 ugly[cnt] 에 못생긴 수를 저장 - 처음 부터 *2, *3, *5 를 해가며 3개의 숫자를 push - minheap을 사용하여, 가장 작은 수를 pop - 위의 내용 MAXN까지 반복 #include typedef long long LL; LL heap[5000] = { 0, 1 }, ugly[1600], hcnt = 1; // 첫 힙에 0과 1을 넣어둠 void Swap(int x, int y) { LL z = heap[x]; heap[x].. 2019. 11. 7.
4 Problem C : 숫자 야구2 - 랜덤 숫자 - 시뮬레이션 - 작은 숫자로 실행해보기 #include #include #include #define MAX 4 #define MAX_COUNT 2520 #define _CRT_SECURE_NO_WARNINGS static int baseballNumbers[MAX]; static int numbersCheck[10]; static int T; extern void tryBest(int suppose[]); ////************ static int queryCallCount; static const int queryLimit = 110; static int scoreTable[MAX_COUNT + 5]; typedef struct Data { int strike; int ball.. 2019. 11. 7.