[백준] 16926번 배열 돌리기 1 (자바 풀이)

문제

https://www.acmicpc.net/problem/16926

 

16926번: 배열 돌리기 1

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

 

풀이

이 문제는 단순 구현 문제이지만, 풀기 쉽지 않았다. 내 풀이는 다음과 같다.

백준 16926 자바 풀이
[그림 1] 예제1

[그림 1]과 같이 temp 배열을 만들고, 사각형의 테두리를 기준으로 왼쪽 위부터 반시계방향으로 원소를 탐색하면서 R칸씩 밀어서 (범위를 벗어나면 나머지 연산) 저장해놓는다. 

 

이후 다시 똑같은 순서로 탐색하면서 temp 배열에 저장해놓은 값을 붙여넣는다.

 

백준 16925번 배열 돌리기 풀이
[그림2] 예제2

그 다음 사각형 테두리를 탐색하면서 똑같은 과정을 반복해준다.

 

코드

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
90
91
92
93
94
95
96
97
98
99
100
import java.io.*;
import java.util.*;
 
public class Baekjoon_16926 {
    public static void main(String[] args)throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st =  new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int R = Integer.parseInt(st.nextToken());
                
        int arr[][] = new int[N][M];
        
        for(int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<M; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        
        int x = 0;
        int y = 0;
        int n = N;
        int m = M;
        while(x<N/2 && y<M/2) {
            int len = n*2+m*2-4;
            int idx = 0;
            int temp[] = new int[len];
            
            // 왼쪽
            for(int i=0; i<n; i++) {
                temp[(idx+R)%len] = arr[x+i][y];
                idx++;
            }
            idx--;
            // 아래
            for(int i=0; i<m; i++) {
                temp[(idx+R)%len] = arr[N-1-x][y+i];
                idx++;
            }
            idx--;
            // 오른쪽
            for(int i=0; i<n; i++) {
                temp[(idx+R)%len] = arr[N-x-i-1][M-1-y];
                idx++;
            }
            idx--;
            // 위
            for(int i=0; i<m; i++) {
                temp[(idx+R)%len] = arr[x][M-y-i-1];
                idx++;
            }
            
            idx = 0
            // 왼쪽
            for(int i=0; i<n; i++) {
                arr[x+i][y] = temp[idx++];
            }
            idx--;
            // 아래
            for(int i=0; i<m; i++) {
                arr[N-1-x][y+i]= temp[idx++];
            }
            idx--;
            // 오른쪽
            for(int i=0; i<n; i++) {
                arr[N-x-i-1][M-1-y] = temp[idx++];
            }
            idx--;
            // 위
            for(int i=0; i<m-1; i++) {
                arr[x][M-y-i-1= temp[idx++];
            }            
            x++;
            y++;
            n -= 2;
            m -= 2;
            if(x==N/2 && y==M/2) {
                if(N%2==1 && M%2 ==1) {
                    arr[x][y] = arr[x][y];
                }
                break;
            }
        }
        
        StringBuilder sb = new StringBuilder();
        
        for(int i=0; i<N; i++) {
            for(int j=0; j<M; j++) {
                sb.append(arr[i][j] +" ");
            }
            sb.append("\n");
        }
        
        System.out.println(sb.toString());
    }
 
}
 
 
cs

 

결과

결과
[그림 3] 결과

쉽지 않았던 문제였다. 더 나은 풀이법이 존재할 것 같다.

반응형

댓글

Designed by JB FACTORY