여니의 취준 준비/코딩테스트 (Java)

[16926] 배열 돌리기 1 in Java

여니's 2022. 8. 5. 12:18

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


접근 방식

1. 가장 바깥에 있는 테두리 -> 가장 안쪽에 있는 테두리 순으로 이동을 시작

: 테두리 개수는 Math.min(n,m) / 2

 

 

2. 이동하기

(참고)

fn, en (현재 테두리의 첫행과 마지막행의 인덱스)

fm, em (현재 테두리의 첫열과 마지막열의 인덱스) 를 이용함.

 

- 맨 윗 줄  (왼쪽으로 1칸씩 이동)

: array[fn][열] = array[fn][열+1];

 

- 맨 오른쪽 줄 (위쪽으로 1칸씩 이동)

: array[행][en] = array[행+1][en];

 

- 맨 아랫 줄 (오른쪽으로 1칸씩 이동)

: array[en][열] = array[en][열-1];

 

= 맨 왼쪽줄 (아래쪽으로 1칸씩 이동)

: array[행][fm] = array[행-1][fm];

 

 


시행 착오

- 4중 for문으로 이동하는 것을 구현하려고 했으나 

인덱스 관리가 복잡해져서 계산하기가 어려웠음.

그래서 for문대신 인덱스 역할을 하는 변수를 선언함

 

 

- 문제 제약 조건에 Math.min(n,m) mod 2 ==0이라는 부분이 쓰여져있는데

이 부분을 꼼꼼하게 살피지 못했음.

그래서 생각하지 않아도 될 경우의 수까지 생각하느라 시간을 낭비함.

 

 

 

 

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
package study;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
 
public class n16926 {
    static int n;
    static int m;
    
    public static int[][] arrayCopy(int[][] newArray,int[][] array){
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                newArray[i][j]=array[i][j];
            }
        }
        return newArray;
    }
    
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n=Integer.parseInt(st.nextToken());
        m=Integer.parseInt(st.nextToken());
        int r=Integer.parseInt(st.nextToken());
        int[][] array=new int[n][m];
        for (int i = 0; i < n; i++) {
            st=new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                array[i][j]=Integer.parseInt(st.nextToken());
            }
        }
        int[][] newArray=new int[n][m];
        newArray=arrayCopy(newArray,array);
        int cnt = Math.min(n,m)/2;
        
        for (int i = 0; i < r; i++) {
            int fn=0int en=n-1int fm=0int em=m-1;
            int temp= array[0][0];            
            for (int p = 0; p <cnt; p++) {
                // 왼쪽으로 이동 (맨윗줄)
                for (int j = fm; j <em ; j++) {
                    newArray[fn][j]=array[fn][j+1];
                }
                // 위쪽으로 이동 (맨오른쪽줄)
                for (int j = fn; j < en; j++) {
                    newArray[j][em]=array[j+1][em];
                }
                // 오른쪽으로 이동 (맨아래줄)
                for (int j = em; j >fm; j--) {
                    newArray[en][j]=array[en][j-1];
                }
                // 아래쪽으로 이동 (맨왼쪽줄)
                for (int j = en; j >fn ; j--) {
                    newArray[j][fm]=array[j-1][fm];
                }
                fn++; en--; fm++; em--;
            }
            array=arrayCopy(array,newArray);
        }
        for(int a=0; a<n; a++) {
            for (int b = 0; b < m; b++) {
                bw.write(array[a][b]+" ");
            }
            bw.write("\n");
        }
        bw.close();
    }
 
}
cs