N * N) break; x += dx[d_idx]; y += dy[d_idx]; array[x][y] = num; if (num == K) { found_x = x + 1; found_y = y + 1; } num+"> N * N) break; x += dx[d_idx]; y += dy[d_idx]; array[x][y] = num; if (num == K) { found_x = x + 1; found_y = y + 1; } num+"> N * N) break; x += dx[d_idx]; y += dy[d_idx]; array[x][y] = num; if (num == K) { found_x = x + 1; found_y = y + 1; } num+">
<aside> 1️⃣
문제: 1913번 달팽이
홀수 N이 주어지면 1부터 N 제곱까지 달팽이 모양 표로 출력.
또 N 제곱 이하의 자연수가 주어지면 그 좌표도 함께 출력함
</aside>
#include <stdio.h>
#include <stdlib.h>
int main() {
int N, K;
scanf("%d", &N);
scanf("%d", &K);
int **array = (int **)malloc(N * sizeof(int *));
for (int i = 0; i < N; i++) {
array[i] = (int *)malloc(N * sizeof(int));
}
int x = N / 2;
int y = N / 2;
array[x][y] = 1;
int dx[] = {-1, 0, 1, 0}; //방향
int dy[] = {0, 1, 0, -1};
int num = 2;
int d_idx = 0;
int step = 1;
int found_x = 0;
int found_y = 0;
//K가 1인 경우 좌표는 중심
if (K == 1) {
found_x = x + 1;
found_y = y + 1;
}
while (num <= N * N) {
//현재 방향으로 step만큼 이동
for (int i = 0; i < 2; i++) {
for (int j = 0; j < step; j++) {
if (num > N * N) break;
x += dx[d_idx];
y += dy[d_idx];
array[x][y] = num;
if (num == K) {
found_x = x + 1;
found_y = y + 1;
}
num++;
}
d_idx = (d_idx + 1) % 4;
if (num > N * N) break;
}
step++;
}
//배열 출력
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", array[i][j]);
}
printf("\\n");
}
//좌표 출력
printf("%d %d\\n", found_x, found_y);
for (int i = 0; i < N; i++) {
free(array[i]);
}
free(array);
}
<aside> 2️⃣
문제: 1448번 삼각형 만들기
N개의 빨대 중 3개를 선택해 이 빨대로 삼각형 만들 수 있을 때 세 변의 길이의 합의 최댓값 구하기
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
int num1 = *(int *)a;
int num2 = *(int *)b;
if (num1 < num2) return 1;
if (num1 > num2) return -1;
return 0;
}
int main() {
int N;
scanf("%d", &N);
int *sticks = (int *)malloc(N * sizeof(int));
for (int i = 0; i < N; i++) {
scanf("%d", &sticks[i]);
}
//내림차순 정렬
qsort(sticks, N, sizeof(int), compare);
for (int i = 0; i < N - 2; i++) {
//가장 긴 변의 길이가 나머지 두 변의 합보다 작은지 확인
//sticks[i] : 가장 긴 변
//sticks[i+1], sticks[i+2] : 나머지 두 변
if (sticks[i] < (long long)sticks[i+1] + sticks[i+2]) {
long long sum = (long long)sticks[i] + sticks[i+1] + sticks[i+2];
printf("%lld\\n", sum);
free(sticks);
return 0;
}
}
//삼각형을 만들 수 없는 경우 -1
printf("-1\\n");
free(sticks);
}