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

문제링크

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

문제

키포인트

  1. dx[4] dy[4]를 잘 설정해 반시계 방향으로 돌도록 설정
  2. 회전할때 2번에 한번씩 전진 길이가 증가
  3. num은 계속 증가시키며 x,y가 r1~r2 c1~c2 범위 안에 속하는 경우만 배열에 넣어주기
  4. 배열의 네 꼭지점은
  • (r1,c1) =>(0,0)
  • (r1,c2) =>(0,c2-c1)
  • (r2,c1) =>(r2-r1,0)
  • (r2,c2) =>(r2-r1,c2-c1)
    에 대응한다.
  1. while문을 통해 배열의 네 꼭지점이 모두 0이 아닐때 까지 계속해서 반복
  2. 가장 큰 수는 배열의 네 꼭지점을 조사해 구할 수 있음
    가장 큰 수에 맞춰 출력 포맷 설정하기 (setw(n) 이용)

시행착오

무난하게 해결한것 같다.

코드

#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
int maps[50][5];
int dx[4]{ 0,-1,0,1 };
int dy[4]{ 1,0,-1,0 };
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int r1, c1, r2, c2;
	cin >> r1 >> c1 >> r2 >> c2;
	
	int dir = 0, cnt = 1;
	int x = 0, y = 0, num = 1, d = 0;
	while (maps[0][0] == 0 || maps[0][c2-c1] == 0 || maps[r2-r1][0] == 0 || maps[r2-r1][c2-c1] == 0) {

		for (int i = 0; i < cnt; i++) {
			if (x >= r1 && x <= r2 && y >= c1 && y <= c2) {
				maps[x-r1][y-c1] = num;
			}
			x += dx[dir];
			y += dy[dir];
			num++;
		}
		dir = (dir + 1) % 4; 
		if (++d == 2) {
			d = 0;
			cnt++;
		}
	}
	num = max({ maps[0][0], maps[0][c2 - c1], maps[r2 - r1][0], maps[r2 - r1][c2 - c1] });
	int prt_format = 0;
	while (num != 0) {
		prt_format++;
		num /= 10;
	}

	for (int i = 0; i <= r2 - r1; i++) {
		for (int j = 0; j <= c2 - c1; j++) {
			cout << setw(prt_format) << maps[i][j] << ' ';
		}
		cout << '\n';
	}
}

후기

다른 골드 구현 문제와 비교했을때 평이한 난이도 인듯하다.

좋은 웹페이지 즐겨찾기