백준

/<> 백준 1913번 : 달팽이 (C언어)

모나오랭 2024. 8. 2. 02:16

https://www.acmicpc.net/problem/1913

 
 
 
1학년 때 C언어 과목 기말고사 1번 문제로 나온 것이 기억납니다. 그 땐 손도 못댔는데 금방 규칙이 보이더군요.
 
 
1. 아래, 오른쪽, 위, 왼쪽 순서로 인덱스 이동을 하는데, 한 바퀴를 돌면 안쪽도 똑같이 진행해주면 됩니다.
 
2. 인덱스의 행 부분을 ridx, 열 부분을 cidx 로 놓았습니다. 그리고 한 바퀴를 돌 때 한 방향으로 n - 1 만큼 진행합니다. (이 때 n은 정사각형의 한 변 길이)
 
3. 한 사이클의 첫 시작은 따로 숫자를 저장하고, 아래 오른쪽 위 방향은 n - 1 만큼 진행, 왼쪽은 n - 2 만큼 진행합니다. 그리고 ridx++ 를 하여 다음 사이클을 시작합니다. 이 때 찾는 숫자가 나오면 해당 ridx, cidx 를 따로 저장합니다.
 
4. 1까지 모두 배열에 저장하면 반복문을 종료합니다.
 
 
<코드>

#include <stdio.h>

int main() {
        int n, number;
        scanf("%d %d", &n, &number);
        int arr[n][n];
        int r, c; // 세로 가로

        int idx = n - 1, ridx = 0, cidx = 0, num = n * n;
        while(1) {
                arr[ridx][cidx] = num; // 사이클 시작은 따로 저장
                if(number == num) {
                        r = ridx;
                        c = cidx;
                }
                num--;
                if(num == 0) break;
                for(int i = 0; i < idx; i++) { // 아래
                        arr[++ridx][cidx] = num;
                        if(number == num) {
                                r = ridx;
                                c = cidx;
                        }
                        num--;
                }
                for(int i = 0; i < idx; i++) { // 오른쪽
                        arr[ridx][++cidx] = num;
                        if(number == num) {
                                r = ridx;
                                c = cidx;
                        }
                        num--;
                }
                for(int i = 0; i < idx; i++) { // 위
                        arr[--ridx][cidx] = num;
                        if(number == num) {
                                r = ridx;
                                c = cidx;
                        }
                        num--;
                }
                for(int i = 0; i < idx - 1; i++) { // 왼쪽
                        arr[ridx][--cidx] = num;
                        if(number == num) {
                                r = ridx;
                                c = cidx;
                        }
                        num--;
                }
                ridx++; // 다음 사이클 준비
                idx -= 2;
        }

        for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) printf("%d ", arr[i][j]);
                printf("\n");
        }
        printf("%d %d\n", r + 1, c + 1);
        return 0;
}

 
 
 
제 코드의 개선점은 해당 좌표의 숫자가 우리가 찾는 숫자와 같은지 체크하는 부분을 함수화해서 코드 줄이면 더 좋을 것 같네요. 코드의 가독성을 높이기 위해 방향 이동에 따른 숫자 저장을 자세하게 적었습니다.
1학년때의 내가 이걸 봤어야 했는데