반응형
출처: 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");
}
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 1526 가장 큰 금민수 (0) | 2021.02.26 |
---|---|
[BOJ] 백준 9517 아이 러브 크로아티아 (0) | 2021.02.26 |
[BOJ] 백준 11657 타임머신 (0) | 2021.02.26 |
[BOJ] 백준 1927 최소 힙 (0) | 2021.02.26 |
[BOJ] 백준 11279 최대 힙 (0) | 2021.02.26 |
댓글