Coding Feature.

백준) 1913번: 달팽이 in C 본문

코딩테스트/백준 solved.ac

백준) 1913번: 달팽이 in C

codingfeature 2023. 7. 28. 17:37

Made with Stable Diffusion

Problem

 

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