코딩테스트/백준 solved.ac
백준) 1913번: 달팽이 in C
codingfeature
2023. 7. 28. 17:37
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
Solution
특정 알고리즘 없이 단순히 구현하는 문제이다.
먼저 예시를 통해 달팽이 모양으로 2차원 배열에 수열이 만들어지는 패턴을 파악해보았다.
N = 5인 경우, 2차원 배열로 보면
가운데 row : 5 / 2 = 2, column : 5 / 2 = 2 index부터 위로 +1, 우측 +1, 아래로 +2, 좌측 +2, 위로 +3 ..
이런 식의 패턴을 확인할 수 있었다.
위, 우측, 아래, 좌측으로 수열을 입력하는 것을 한 사이클로 잡으면,
총 사이클의 수는 N / 2 = 5 / 2 = 2 번이다.
그리고 사이클 이후에 위 그림의 빨간색 화살표를 추가로 입력하면 전체 달팽이가 완성이 되는 것이다.
위 패턴을 그대로 코드로 풀이하면 된다.
Code
#include <stdio.h>
int arr[999][999] = {0, };
int main(){
int N, find, count = 1, size = 1, row, col, i, j, answer_row, answer_col;
scanf("%d", &N);
scanf("%d", &find);
row = N / 2;
col = N / 2;
arr[row][col] = count++;
for(j=0;j<N/2;j++){ // 한 사이클
for(i=1;i<=size;i++)
arr[--row][col] = count++; // 위로 이동
for(i=1;i<=size;i++)
arr[row][++col] = count++; // 우측으로 이동
size++;
for(i=1;i<=size;i++)
arr[++row][col] = count++; // 아래로 이동
for(i=1;i<=size;i++)
arr[row][--col] = count++; // 좌측으로 이동
size++;
}
for(i=1;i<=size-1;i++)
arr[--row][col] = count++; // 위로 추가 이동
for(i=0;i<N;i++){
for(j=0;j<N;j++){
printf("%d ", arr[i][j]);
if(arr[i][j] == find){
answer_row = i+1;
answer_col = j+1;
}
}
printf("\n");
}
printf("%d %d\n", answer_row, answer_col);
return 0;
}