https://www.acmicpc.net/problem/16926
접근 방식
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=0; int en=n-1; int fm=0; int 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 |
'여니의 취준 준비 > 코딩테스트 (Java)' 카테고리의 다른 글
[2023] 신기한 소수 in Java (0) | 2022.08.05 |
---|---|
[2615] 오목 in Java (0) | 2022.08.05 |
[17726] 배열 돌리기 in Java (0) | 2022.08.05 |
[2164] 카드2 in Java (0) | 2022.08.04 |
[SWEA] 1225번 [S/W 문제해결 기본] 7일차 - 암호생성기 in Java (0) | 2022.08.04 |