본문 바로가기
백준일지

[백준] 1022번 소용돌이 예쁘게 출력하기

by 민지기il 2025. 3. 22.
#include <bits/stdc++.h>
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#define MAX 10001

using namespace std;

int arr[51][5] = { 0, };
// 오, 위, 왼, 아
int dx[] = { 0, -1, 0, 1 };
int dy[] = { 1, 0, -1, 0 };


int main() {
	int r1, c1, r2, c2;
	scanf("%d %d %d %d", &r1, &c1, &r2, &c2);
	int len = 1;
	int cnt = 1;
	
	int x = 0, y = 0;
	if (r1 <= x && x <= r2 && c1 <= y && y <= c2) {
		arr[x - r1][y - c1] = cnt;
	}
	cnt++;

	int curLen = 0;
	int dir = 0;

	while(arr[0][0] == 0 || arr[r2 - r1][0] == 0 || arr[r2 - r1][c2 - c1] == 0 || arr[0][c2 - c1] == 0) {
		x += dx[dir], y += dy[dir];

		// 범위 내의 결과만 배열에 담는다.
		if (r1 <= x && x <= r2 && c1 <= y && y <= c2) {
			arr[x - r1][y - c1] = cnt;
		}

		cnt++;
		curLen++;

		if (curLen == len) {
			curLen = 0;
			dir++;
			dir %= 4;

			if (dir == 0 || dir == 2)
				len++;
		}
	}

	int space = 0;
	while (cnt != 0) {
		cnt /= 10;
		space++;
	}
	for (int i = 0; i <= r2 - r1; i++) {
		for (int j = 0; j <= c2 - c1; j++) {
			printf("%*d ", space, arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

<변수>

cnt: 몇 칸 왔는지, len: 몇 칸 가야 되는지(1 1 2 2 ...)로 2번에 1칸씩 이동하게 되므로 증가

curLen: 현재까지 이동한 칸 수 

printf("%*d", space, arr[i][j]);로 띄어쓰기 맞춰서 print하기

 

1. 배열은 음수 좌표를 못 쓰니까 → 배열의 인덱스를 arr[x - r1][y - c1]로 조정해서 저장한다.

만약 x = 0, y = 0 이면 → arr[0 - (-3)][0 - (-3)] → arr[3][3] 에 저장됨

2. 처음 저장 위치는 지금 (0, 0)이 우리가 보고 싶은 범위 안에 있는지 확인함

있다면 arr 배열에 저장함 (while문 시작 전 현재 위치 값(0,0)에 저장함)

3. if문을 통해 x,y 이동한 좌표가 우리가 저장하고 싶은 범위 안에 있으면 저장함

4. len: 현재 방향으로 가야 (목표 거리), curLen: 현재 방향으로 이동했는지 세는 중간 거리 (진행 상황), 가야할 방향만큼 갔으면 방향 전환이 필요!

5. cnt 최종적으로 채워진 숫자 (가장 숫자 + 1) 상태

while (cnt != 0) { cnt /= 10; space++; } 하면 cnt=47, space=0 / cnt=4, space = 1 / cnt = 0, space =2 상황임

 

<참고>

https://100100e.tistory.com/323

 

'백준일지' 카테고리의 다른 글

[백준] 1738번 골목길  (0) 2025.03.25
[프로그래머스] 스타 수열  (0) 2025.03.24
[백준] 13317번 한 번 남았다  (0) 2025.03.21
[프로그래머스] 양과 늑대  (0) 2025.03.20
[백준] 2179번 비슷한 단어  (0) 2025.03.20