[백준 C++] 1913 달팽이

이성훈·2022년 3월 3일
0
post-custom-banner

문제

홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.

N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.

입력

첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.

출력

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.

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

풀이

처음에는 수학적으로 접근하여 맨윗줄부터 규칙을 찾으려했으나. 실패하고, 결국 좌상단부터 이동방향, 위치를 모두 변수로 나타내어 하나씩
2차원배열에 숫자를 찍도록 코드를 짜보았다.


입력값을 받아 n*n크기의 2차원배열을 만든다.

다음으로 숫자 n*n부터 1까지 역순으로 기록할때 사용할 변수들

  • flag는 방향변수로 0부터 3 까지 아래 오른쪽 위 왼쪽을 나타냄.

  • down, right, up, left는 아래인덱스끝 오른쪽인덱스끝,.. 으로,
    x좌표 y좌표가 해당값과 일치하면 방향을 틀어서 한칸 이동하도록 코드를 짰다.


이중에서
이부분은 문제에서 출력2번째줄로 찾고자하는값의 위치를 기록하는부분이다.

이렇게진행한뒤 마지막으로 모두 출력해주면 끝이다.

#define _CRT_SECURE_NO_WARNINGS 
#include <bits/stdc++.h>

int main(void) {

	int n, m;
	scanf("%d\n%d", &n, &m);

	int** map = new int* [n]; //메모리설정
	for (int i = 0; i < n; i++)
		map[i] = new int[n];

	for (int i = 0; i < n; i++) //초기화
		for (int j = 0; j < n; j++)
			map[i][j] = 0;
	

	//0 : ↓
	//1 : →
	//2 : ↑
	//3 : ←
	int flag = 0; //방향을 기억
	int r = 0, c = 0; //행, 열 위치
	//지나온길을 못지나가게 하는 4방향 변수
	int down = n, right = n, up = -1, left = 0; 
	//찾고자하는 값의 위치
	int locX, locY;
	
	for (int i = n*n; i >= 1; i--) { //역으로 기록
		map[r][c] = i; //현재위치 기록

		if (i == m) {
			locX = r;
			locY = c;
		}

		if (flag == 0) {
			r++;

			if (r == down) {
				r--;
				c++;
				flag++;
				down--;
			}
		}
		else if (flag == 1) {
			c++;

			if (c == right) {
				c--;
				r--;
				flag++;
				right--;
			}
		}
		else if (flag == 2) {
			r--;

			if (r == up) {
				r++;
				c--;
				flag++;
				up++;
			}
		}
		else if (flag == 3) {
			c--;

			if (c == left) {
				c++;
				r++;
				flag = 0;
				left++;
			}
		}

	}

	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++) {
			printf("%d ", map[i][j]);
		}
		printf("\n");
	}
	printf("%d %d", locX+1, locY+1);

	return 0;
}
profile
I will be a socially developer
post-custom-banner

0개의 댓글