백준 1022 소용돌이 예쁘게 출력하기
문제링크
https://www.acmicpc.net/problem/1022
문제
키포인트
- dx[4] dy[4]를 잘 설정해 반시계 방향으로 돌도록 설정
- 회전할때 2번에 한번씩 전진 길이가 증가
- num은 계속 증가시키며 x,y가 r1~r2 c1~c2 범위 안에 속하는 경우만 배열에 넣어주기
- 배열의 네 꼭지점은
- (r1,c1) =>(0,0)
- (r1,c2) =>(0,c2-c1)
- (r2,c1) =>(r2-r1,0)
- (r2,c2) =>(r2-r1,c2-c1)
에 대응한다.
- while문을 통해 배열의 네 꼭지점이 모두 0이 아닐때 까지 계속해서 반복
- 가장 큰 수는 배열의 네 꼭지점을 조사해 구할 수 있음
가장 큰 수에 맞춰 출력 포맷 설정하기 (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';
}
}
후기
다른 골드 구현 문제와 비교했을때 평이한 난이도 인듯하다.
Author And Source
이 문제에 관하여(백준 1022 소용돌이 예쁘게 출력하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@bgg01578/백준-1022-소용돌이-예쁘게-출력하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)