CS/알고리즘_문제풀이(자바)

배열 돌리기 2

Jedy_Kim 2021. 11. 24. 12:11
728x90

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

 

16927번: 배열 돌리기 2

크기가 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
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
import java.util.*;
import java.io.*
 
public class Main {   
  
  
  // 우, 하, 좌, 상
  static final int[][] DELTAS = { { 01 }, { 10 }, { 0-1 }, { -10 } };
  static int N, M, R, CNT;
  static int[][] arr, temp; 
  
  
  // main  
  public static void main( String[] args ) throws Exception {
    
    // Please Enter Your Code Here 
    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() );
    R   = Integer.parseInt( st.nextToken() );
    arr = new int[N][];
    for ( int i = 0; i < N; ++i ) arr[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    
    // 회전해야할 사각형의 개수
    CNT = Math.min( N, M ) / 2;
    
    // 전략
    // 1. 바깥 테두리부터 차근차근 회전을 한다
    // 2. 여기서 생각해봐야할 점은 R이 13번 주어졌고, 길이가 12라고 하면 결과는 결국 1만 회전시키면 된다.
    //    이를 % 연산자를 통해 표현할 수 있다. 
    // 3. 바깥 테두리에서 안쪽 테두리로 들어갈 땐 (가로길이 - 2), (세로길이 - 2) 이다.
    int n = N, m = M;
    for ( int start = 0; start < CNT; ++start ) {
      roatate( start, ( ( n * 2 ) + ( m * 2 ) - 4 ) );
      n -= 2;
      m -= 2;
    } 
    
    // 답을 구한다.  
    StringBuilder sb = new StringBuilder();
    for ( int[] ar1 : arr ) {
      for ( int ar2 : ar1 ) sb.append(ar2 + " ");
      sb.append("\n");
    }
      
    bw.write(sb.toString()); 
    bw.flush();
    bw.close();
    br.close(); 
  }   
  
  
  // 회전 메서드
  static void roatate( int start, int len ) {
    
    // 불필요한 반복횟수를 줄여줌
    int rotationCnt = R % len;
    
    for ( int i = 0; i < rotationCnt; ++i ) {
      
      int row = start, col = start, dir = 0, startVal = arr[start][start];
      while ( dir < 4 ) {
        
        int ny = row + DELTAS[dir][0];
        int nx = col + DELTAS[dir][1];
        
        if ( ( ny >= start && nx >= start ) && ( ny < ( N - start ) ) && ( nx < ( M - start ) ) ) {
          arr[row][col] = arr[ny][nx];
          row = ny;
          col = nx;
        }
        else ++dir;
        
      } 
      arr[row + 1][col] = startVal;
    }
    
  }// 회전 메서드 종료 
  
cs

 

반응형

'CS > 알고리즘_문제풀이(자바)' 카테고리의 다른 글

평범한 배낭  (0) 2021.11.29
소수&팰린드롬  (0) 2021.11.29
배열 돌리기 1  (0) 2021.11.23
배열 돌리기 3  (0) 2021.11.22
1, 2, 3 더하기 4  (0) 2021.11.19