solved.ac class 163

[백준 2448] 별 찍기 - 11 [C]

풀이 출력 할 삼각형의 맨 위의 좌표(빨간 원)를 (0, N-1)이라고 하자. 이진트리 처럼 좌측 하단 삼각형의 맨 위 좌표(왼쪽 초록 원)는 (0 + N/2, N-1 - N/2), 우측 하단 삼각형의 맨 위 좌표(오른쪽 초록 원)는 (0 + N/2, N-1 + N/2)이다. 분할정복을 시행할 때마다, 입력받은 크기를 2로 나누어 건네주며, 전달받은 크기가 3이 될 때 배열에 빨간원 - 좌측 초록원 - 우측 초록원 이 순서대로 가장 작은 삼각형 내부에 별을 채워 넣는 것이다. 출력형식에 약간의 장난(?)이 숨어있다. 예제 출력을 드래그 해보니, 각 행의 마지막 별을 찍고 개행이 아니라, 공백을 출력해줘야 한다. memset()를 사용해 배열을 빠르게 초기화하고, 별을 채워 넣자. 소스코드 #include..

[백준 10989] 수 정렬하기 3 [C]

풀이 "수 정렬하기 2"와는 반대로 시간효율보다 공간효율이 중시되는 문제이기 때문에 동일한 코드를 사용하면 틀릴 것 이다. 그래서, 주어지는 숫자의 개수를 배열에 저장 후, 각 숫자의 개수만큼 반복해서 출력하는 방법으로 해결했다. 소스코드 #include #define MAX 10000 int main(){ int N, num, cnt[MAX] = {0, }; scanf("%d", &N); while (N--){ scanf("%d", &num); cnt[num-1]++; } for (int i = 0; i < MAX; i++) if (cnt[i] != 0) for (int j = 0; j < cnt[i]; j++) printf("%d\n", i + 1); } 출처 10989번: 수 정렬하기 3 첫째 줄에..

[백준 1085] 직사각형에서 탈출 [C]

풀이 (x, y)가 경계선(x, 0), (0, y)과, 직선 x = w, y = h 중 어디까지의 거리가 최솟값인지 구하면 된다. 소스코드 #include #define MIN(a,b) (a < b ? a: b) int main(){ int x, y, w, h, min; scanf("%d %d %d %d", &x, &y, &w, &h); printf("%d", MIN(MIN(w - x, x), MIN(h - y, y))); } 출처 1085번: 직사각형에서 탈출 한수는 지금 (x, y)에 있다. 직사각형의 왼쪽 아래 꼭짓점은 (0, 0)에 있고, 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오. www.acmicpc.net

[백준 1978] 소수 찾기 [C]

풀이 입력받은 수 num이 num/2 이하의 범위 중에 소수가 존재하는지 몇 줄 내로 간단하게 해결할 수 있지만, 에라토스테네스의 체를 이용해 효율적으로 풀이해봤다. 에라토스테네스의 체는 고대 그리스 수학자 에라토스테네스가 발견한 소수를 구하는 알고리즘이다. N까지의 수는, N의 제곱근보다 작은 정수들의 배수를 모두 지우고 남는 수가 소수라는 사실을 알 수 있다. 이번 문제에서 주어지는 최대의 자연수는 1000으로, 1000의 제곱근인 31.62xxx보다 작은 정수 31까지의 배수들을 제외하고 남은 수들이 소수임을 알 수 있다. 하지만, 문제에서 입력받는 수가 소수인지 확인하기 위해 탐색하는 과정이 효율적이지 못해 위에서 조작한 배열을 소수와 소수가 아닌 구간으로 정렬해주었다. int arr[MAX], ..

[백준 11651] 좌표 정렬하기 2 [C]

풀이 좌표 정렬하기 1에서는 x를 우선으로 오름차순 정렬 후, x의 값이 동일할 때 y의 값으로 오름차순 정렬했지만, 이번 문제에서는 반대로 y를 오름차순 정렬 후, 동일값일때 x를 기준으로 오름차순 정렬하면 해결할 수 있다. 소스코드 #include #include typedef struct{ int x, y; }Point; int compare(const void *a, const void *b){ Point p1 = *(Point*)a, p2 = *(Point*)b; if (p1.y p2.y) return 1; else { if (p1.x p2.x) return 1; retu..

[백준 1920] 수 찾기 [C]

풀이 이분 탐색이란, 검색 범위를 줄여나가면서 원하는 데이터를 검색하는 알고리즘이다. 이를 사용하기 위해서는 요소들이 반드시 정렬되어 있어야 한다. N개의 정수를 Quick Sort로 정렬해준 후, M개의 정수를 입력받음과 동시에 Binary Search로 탐색해 해결했다. Binary Search의 Big-O는 O(log2n)이지만, n은 최대 100,000으로 재귀 함수로 구현해도 Stack Overflow가 발생하지 않기 때문에 재귀적/비재귀적 방법으로 둘 다 사용 가능하다. 소스코드 #include #include int compare(const void *a, const void *b){ int n1 = *(int *)a, n2 = *(int *)b; if (n1 < n2) return -1; ..

[백준 11650] 좌표 정렬하기 [C]

풀이 x를 기준으로 오름차순으로 정렬하는데, 만약 x의 값이 동일하다면 y의 값을 기준으로 오름차순으로 정렬하면된다. 소스코드 #include #include typedef struct{ int x, y; }Point; int compare(const void *a, const void *b){ Point p1 = *(Point*)a, p2 = *(Point*)b; if (p1.x p2.x) return 1; else { if (p1.y p2.y) return 1; return 0; } } int main(){ int N; scanf("%d", &N); Point p[N]; for..

[백준 2751] 수 정렬하기 2 [C]

풀이 시간 제한이 2초라, 공간효율보다는 시간효율을 중시해 코드를 작성했다. 소스코드 #include #include int num[1000001]; int compare(const void *a, const void *b){ int n1 = *(int *)a, n2 = *(int *)b; if (n1 n2) return 1; return 0; } int main(){ int N; scanf("%d", &N); for (int i = 0; i < N; i++) scanf("%d", &num[i]); qsort(num, N, sizeof(int), compare); for (int i = 0; i < N; i++) printf("%d\n", num[i..

[백준 2609] 최대공약수와 최소공배수 [C]

풀이 유클리드 호제법은 최대공약수를 구하는 알고리즘이다. 두 수 N, M (N > M)을 입력받는다. N을 M으로 나누었을 때의 몫과 나머지가 N, M이 되며 이 과정을 나머지가 0이 될 때 까지 반복한다.\ 나머지가 0이 될때의 N(몫)이 최대공약수이다. 두 수 N, M의 곱은 최대공약수(GCD)와 최소공배수(LCM)의 곱과 같다. 소스코드 #include int euclidean_gcd(int n, int m){ return m ? euclidean_gcd(m, n%m) : n; } int main(){ int n, m; scanf("%d %d", &n, &m); int gcd = euclidean_gcd(n, m); printf("%d\n%d", gcd, n*m / gcd); } 출처 및 참고자료 ..

[백준 1181] 단어 정렬 [C]

풀이 문자열과 문자열의 길이를 구조체 배열로 저장해주고, Quick Sort를 사용해 길이에 따라 오름차순 정렬 후, 길이가 같을 때는 strcmp()로 문자열을 비교해 문자열이 크고 작은지에 따라 정렬해준다. 문자열을 비교해 동일한 문자열을 가지는 구조체가 없을때만 출력해준다. 소스코드 #include #include #include typedef struct { char str[51]; int len; }Str; int compare(const void *a, const void *b){ Str s1 = *(Str*)a, s2 = *(Str*)b; if (s1.len s2.len) return 1; return strcmp(s1.s..