#유형 : 시뮬레이션
# 규칙을 찾는데 시간이 오래 걸렸고, 메모리 생각안하고 전체 소용돌이 출력하다가 메모리 초과가 났다. 따라서 소용돌이 중 범위에 해당하는 부분만 구해서 출력을 했더니 해결하였다.
소용돌이 규칙
1. 시작 방향은 오른쪽, 진행 방향은 오른쪽->위쪽->왼쪽->아래->오른쪽.. 반복이다
2. 회전을 두 번 할 때마다 전진하는 길이가 늘어난다. 결국은 오른쪽과 왼쪽으로 이동 시에 길이가 1개씩 늘어나는 셈이다.
3. 소용돌이 전체를 구하면 메모리 초과가 난다. 따라서 구간에 속하는 부분만 구한다.
4. 띄어쓰기는 가장 큰 숫자의 자리수에서 해당하는 숫자의 자리수의 차이를 구한 만큼 공백을 더해줘서 출력한다.
예시)
1(오른쪽,1칸)->2(위쪽,1칸)->3(왼쪽,2칸)->5(아래쪽,2칸)->7(오른쪽,3칸)->10(위쪽,3칸)->13(왼쪽,4칸)->17...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
package bj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class p1022 {
static int arr[][] = new int[50][5];
static int moveX[] = {1,0,-1,0};
static int moveY[] = {0,-1,0,1};
static int r1,r2,c1,c2;
static int maxCount, maxValue=0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
r1 = Integer.parseInt(st.nextToken());
c1 = Integer.parseInt(st.nextToken());
r2 = Integer.parseInt(st.nextToken());
c2 = Integer.parseInt(st.nextToken());
solve();
int space = len(maxValue);
int currentSpace = len(arr[i][j]);
for(int k=0; k<space-currentSpace; k++)
System.out.print(" ");
System.out.print(arr[i][j]+" ");
}System.out.println();
}
// for(int i=0; i<50; i++) {
// for(int j=0; j<5; j++) {
// System.out.print(arr[i][j]+" ");
// }
}
public static int len(int value) {
int result = 0;
while(value>=10) {
result++;
value/=10;
}
return result;
}
public static void solve() {
int x = 0,y = 0;
int val = 1;
int cnt = 1;
int d=0;
int len=0;
boolean visit=false;
if(r1<=y && y<=r2 && c1<=x && x<=c2) {
arr[y-r1][x-c1] = val++;
cnt++;
visit = true;
}
if(!visit)
val++;
while(cnt<=maxCount) {
d%=4;
if(d==0 || d==2)
len++;
for(int i=0; i<len; i++) {
x += moveX[d];
y += moveY[d];
if(r1<=y && y<=r2 && c1<=x && x<=c2) {
arr[y-r1][x-c1] = val;
maxValue = Math.max(maxValue, val);
cnt++;
}
val++;
}
d++;
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
'백준' 카테고리의 다른 글
#백준_1120 문자열 - Java 자바 (0) | 2020.01.31 |
---|---|
#백준_1342 행운의 문자열 - Java 자바 (0) | 2020.01.31 |
#백준_1405 미친 로봇 - Java 자바 (0) | 2020.01.30 |
#백준_1057 토너먼트 - Java (0) | 2020.01.29 |
#백준_1019 책 페이지 - Java (0) | 2020.01.29 |