https://www.acmicpc.net/problem/16935
접근 방식
시행 착오
- 3,4번 연산시 배열의 행과 열이 바뀔 수 있다는 걸 생각하지 못했음
행과 열이 바뀔 수 있으니 수시로 n,m을 갱신해줘야함 (refresh() 함수 이용)
- 1,2번 연산시 새로운 newArray에 값을 담고,
깊은 복사를 통해 array에 다시 넣으려고 함.
그런데 temp 변수 하나만을 이용하게 되면
위 과정을 생략할 수 있음
1번 연산의 경우 상하로 반전되는 것이므로n/2번 변경을 진행해주면 된다.
n번 변경할 경우, 처음 array 값이 출력됨을 주의
2번 연산의 경우 좌우로 반전되는 것이므로1번 연산과 마찬가지로 n/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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | package day_0810; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Map; import java.util.StringTokenizer; public class n16935 { static int n; static int m; static int[][] array; public static void refresh() { // n과 m 값갱신 n=array.length; m=array[0].length; } public static void num1Func() { // 1번 연산 = 상하반전 refresh(); for(int i=0; i<n/2; i++) { for(int j=0; j<m; j++) { // swap int temp=array[i][j]; array[i][j]=array[n-1-i][j]; array[n-1-i][j]=temp; } } } public static void num2Func() { // 2번 연산 = 좌우반전 refresh(); for(int i=0; i<m/2; i++) { for(int j=0; j<n; j++) { // swap int temp=array[j][i]; array[j][i]=array[j][m-1-i]; array[j][m-1-i]=temp; } } } public static void num3Func() { // 3번 연산 = 오른쪽으로 90도 회전 refresh(); int[][] newArray = new int[m][n]; for(int j=0; j<m; j++) { for(int i=0; i<n; i++) { newArray[j][i]=array[n-1-i][j]; } } array=newArray; } public static void num4Func() { // 4번 연산 = 왼쪽으로 90도 회전 refresh(); int[][] newArray = new int[m][n]; for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { newArray[i][j]=array[j][m-1-i]; } } array=newArray; } // 부분 배열 크기 N/2 X M/2 public static void num5Func() { // 5번 연산 = 부분배열 위치 변경1 refresh(); int[][] newArray= new int[n][m]; // 1번 -> 2번으로 for (int i = 0; i < n/2; i++) { for (int j = m/2; j < m; j++) { newArray[i][j]=array[i][j-m/2]; // 2번 <= 1번값 대입 } } // 2번 -> 3번으로 for (int i = n/2; i < n; i++) { for (int j = m/2; j < m; j++) { newArray[i][j]=array[i-n/2][j]; // 3번 <= 2번값 대입 } } // 3번 -> 4번으로 for (int i = n/2; i < n; i++) { for (int j = 0; j < m/2; j++) { newArray[i][j]=array[i][j+m/2]; // 4번 <= 3번값 대입 } } // 4번 -> 1번으로 for (int i = 0; i < n/2; i++) { for (int j = 0; j < m/2; j++) { newArray[i][j]=array[n/2+i][j]; // 1번 <= 4번값 대입 } } array=newArray; // 수정값, 원래 배열에 대입 } public static void num6Func() { // 6번 연산 = 부분배열 위치 변경 2 refresh(); int[][] newArray= new int[n][m]; // 1번 -> 4번으로 for (int i = n/2; i < n; i++) { for (int j = 0; j < m/2; j++) { newArray[i][j]=array[i-n/2][j]; // 4번 <= 1번값 대입 } } // 4번 -> 3번으로 for (int i = n/2; i < n; i++) { for (int j = m/2; j < m; j++) { newArray[i][j]=array[i][j-m/2]; // 3번 <= 4번값 대입 } } // 3번 -> 2번으로 for (int i = 0; i < n/2; i++) { for (int j = m/2; j < m; j++) { newArray[i][j]=array[n/2+i][j]; // 2번 <= 3번값 대입 } } // 2번 -> 1번으로 for (int i = 0; i < n/2; i++) { for (int j = 0; j < m/2; j++) { newArray[i][j]=array[i][j+m/2]; // 1번 <= 2번값 대입 } } array=newArray; // 수정값, 원래 배열에 대입 } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); StringTokenizer st = new StringTokenizer(br.readLine()); n=Integer.parseInt(st.nextToken()); // 행의 크기 (짝수) m=Integer.parseInt(st.nextToken()); // 열의 크기 (짝수) int R=Integer.parseInt(st.nextToken()); // 연산의 수 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()); } } st=new StringTokenizer(br.readLine()); for(int r=0; r<R; r++) { int curR=Integer.parseInt(st.nextToken()); // 현재 연산 종류 // 함수 실행 if (curR==1) num1Func(); else if (curR==2) num2Func(); else if (curR==3) num3Func(); else if (curR==4) num4Func(); else if (curR==5) num5Func(); else if (curR==6) num6Func(); } refresh(); // n,m 갱신 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { sb.append(array[i][j] + " "); } sb.append("\n"); } System.out.println(sb); } } | cs |
'여니의 취준 준비 > 코딩테스트 (Java)' 카테고리의 다른 글
[17070] 파이프 옮기기 1 in Java (0) | 2022.08.10 |
---|---|
[1010] 다리 놓기 in Java (0) | 2022.08.10 |
[2563] 색종이 in Java (0) | 2022.08.09 |
[1861] 정사각형 방 in Java (0) | 2022.08.09 |
[6808] 규영이와 인영이의 카드게임 in Java (0) | 2022.08.09 |