PS

BOJ 1022 - 소용돌이 출력

728x90

www.acmicpc.net/problem/1022

 

1022번: 소용돌이 예쁘게 출력하기

첫째 줄에 네 정수 r1, c1, r2, c2가 주어진다.

www.acmicpc.net

 

구현 문제이다.

먼저 맵을 표현하는 배열 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