본문 바로가기
PS 문제 풀이/Baekjoon

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

by 까망 하르방 2021. 2. 26.
반응형

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

 Input 
-3 -3 2 0

 Output 

37 36 35 34

38 17 16 15

39 18  5  4

40 19  6  1

41 20  7  8

42 21 22 23

 

주어지는 r1, c1, r2, c2 있는 그대로 배열을 만들면 메모리가 초과합니다.

문제상에서는 음수로 인덱스가 잡혀있기에 이에 대한 조정이 필요합니다.

(r2-r1) × (c2-c1) 크기의 배열을 만듭니다.

음수 인덱스의 경우, (x - r1, y - c1)로 값을 계산해서 (0, 0) ~(r2 - r1, c2 - c1) 영역으로 대체합니다.

결과적으로 x-r1 >=0 && x-r1 <= (r2-r1) && y-c1 >=0 && y-c1 <= (c2-c1)경우만 map[][]에 표시합니다.


#include <iostream>
#include <cstdio>
#include <stdlib.h>
using namespace std;
 
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
int map[50][5];
int main(){
 
    int r1, c1, r2, c2;
    int x, y, n, dir, next, cnt, dcnt, num;
    x = y = 0;
    dir = 3;
    dcnt = num = 1;
    cnt = 0;
    cin >> r1 >> c1 >> r2 >> c2;
 
    while(!(( map[0][0] != 0 ) && (map[0][c2-c1] != 0 ) && (map[r2-r1][0] != 0 ) && (map[r2-r1][c2-c1] != 0))){
        // 범위 내 숫자인 경우
        if(x-r1 >=0 && x-r1 <= (r2-r1) && y-c1 >=0 && y-c1 <= (c2-c1)){
            map[x-r1][y-c1] = num;
        }
        num++; 
        cnt++;
 
        x = x+dx[dir]; 
        y = y+dy[dir];
 
        // 방향전환하며 소용돌이 형성
        if(cnt == dcnt){
            cnt=0;
            dir = (dir+1) % 4;
            if(dir == 3 || dir == 1)
                dcnt++;
        }
    }
 
    //출력폭 계산
    cnt=0;
    while(num > 0){ 
        num /= 10;
        cnt++; 
    }
 
    // 정답 출력
    for(int i=0; i <= (r2-r1); i++){
        for(int j=0; j <= (c2-c1); j++){
            printf("%*d ", cnt, map[i][j]);
        }
        printf("\n");
    }
}

 

반응형

댓글