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);
}

image.png

<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); 
}

image.png