백준
/<> 백준 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학년때의 내가 이걸 봤어야 했는데