728x90
구현 문제이다.
먼저 맵을 표현하는 배열 int adj[50][5] 를 선언한다.
주의할것은, 문제에서 (0, 0) 의 좌표가 (-3, -3) 이 들어가기 때문에, (0, 0) 을 그대로 적용시키면 틀리게 된다
그러므로, 좌표 맞출때만 신경써서 처리하면된다
그리고 입력 받은 값의 절댓값중 최댓값을 찾아서 그 값만큼 돌아야한다 (소용돌이의 최대갯수임)
그리고 나머지 4방향으로 돌아야 하는데, 소용돌이가 돌아가는 모양새를 보면 얼마만큼 움직여야 하는지 알 수 있게 된다 (그 값을 cnt 를 기준으로 처리)
그리고 4방향으로 돌면서 무조건 값을 넣는게 아니라, 문제에서 입력받은 범위내에 있을때만 값을 넣는다.
출력시에, 숫자 자릿수에 따라서 출력이 다르게 나올 수 있으므로, 최대 자릿수를 찾아내서 그만큼 간격을 띄워서 출력하면 된다.
- C++
#include <bits/stdc++.h>
using namespace std;
int r1, c1, r2, c2;
int adj[50][5];
void solve() {
int max_num = max(max(abs(r1), abs(c1)), max(abs(r2), abs(c2)));
int val = 1; // 배열에 붙일 값
// 시작 지점 (1을 붙이는곳)
if (r1 <= 0 && r2 >= 0 && c1 <= 0 && c2 >= 0) adj[0 - r1][0 - c1] = val;
int cnt = 0; // 카운팅
int y = 0, x = 0; // 좌표
for (int i = 1; i <= max_num + 1; ++i) {
for (int j = 1; j <= 1 + cnt * 2; ++j) {
val++;
x++; // 오른쪽으로 이동
// 입력으로 주어진 범위 내에 있을때만 값을 부여함.
if (r1 <= y && r2 >= y && c1 <= x && c2 >= x) adj[y - r1][x - c1] = val;
}
for (int j = 1; j <= 1 + cnt * 2; ++j) {
val++;
y--; // 위로 이동
if (r1 <= y && r2 >= y && c1 <= x && c2 >= x) adj[y - r1][x - c1] = val;
}
for (int j = 1; j <= 2 + cnt * 2; ++j) {
val++;
x--; // 왼쪽으로 이동
if (r1 <= y && r2 >= y && c1 <= x && c2 >= x) adj[y - r1][x - c1] = val;
}
for (int j = 1; j <= 2 + cnt * 2; ++j) {
val++;
y++; // 아래로 이동
if (r1 <= y && r2 >= y && c1 <= x && c2 >= x) adj[y - r1][x - c1] = val;
}
cnt++;
}
}
int main() {
cin.tie(0); ios_base::sync_with_stdio(0);
cin >> r1 >> c1 >> r2 >> c2;
solve();
int H = abs(r2 - r1), W = abs(c2 - c1); // 높이, 너비
int max_num = 0; // 맵에 쓰여진 최대값
for (int i = 0; i <= H; ++i)
for (int j = 0; j <= W; ++j)
max_num = max(max_num, adj[i][j]);
int max_degree = 0; // 최대값의 자릿수를 저장
for (int i = 1; i <= max_num; i *= 10) max_degree++;
// 자릿수를 맞추는 이유는 출력시에 일정하게 출력하기 위해서이다.
for (int i = 0; i <= H; ++i) {
for (int j = 0; j <= W; ++j) {
int current_degree = 0;
for (int k = 1; k <= adj[i][j]; k *= 10) current_degree++;
for (int k = current_degree; k < max_degree; ++k) cout << " ";
cout << adj[i][j] << " ";
}
cout << "\n";
}
return 0;
}
|
cs |
728x90
'PS' 카테고리의 다른 글
BOJ 2109 - 순회강연 (0) | 2021.03.02 |
---|---|
BOJ 1082 - 방번호 (1) | 2021.03.02 |
BOJ 16120 - PPAP (0) | 2021.02.21 |
BOJ 2515 - 전시장 (0) | 2021.02.21 |
BOJ 3197 - 백조의 호수 (0) | 2021.02.21 |