#유형 : 시뮬레이션

# 규칙을 찾는데 시간이 오래 걸렸고, 메모리 생각안하고 전체 소용돌이 출력하다가 메모리 초과가 났다. 따라서 소용돌이 중 범위에 해당하는 부분만 구해서 출력을 했더니 해결하였다.

 

소용돌이 규칙

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;
 
 
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());
        
        maxCount = (Math.abs(r1-r2)+1* (Math.abs(c1-c2)+1);
        
        solve();
        
        int space = len(maxValue);
        for(int i=0; i<=Math.abs(r1-r2); i++) {
            for(int j=0; j<=Math.abs(c1-c2); j++) {
                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]+" ");
//            }System.out.println();
//        }
        
    }
    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<=r2 && c1<=&& 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<=r2 && c1<=&& 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

+ Recent posts