반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [백준 알고리즘] 백준 16935번 배열 돌리기3 자바(Java)

1) 문제번호 : 16935번

 

2) 문제 출처

www.acmicpc.net/problem/16935

 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

 

2. 문제

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다.

1번 연산은 배열을 상하 반전시키는 연산이다.

2번 연산은 배열을 좌우 반전시키는 연산이다.

3번 연산은 오른쪽으로 90도 회전시키는 연산이다.

4번 연산은 왼쪽으로 90도 회전시키는 연산이다.

5, 6번 연산을 수행하려면 배열을 크기가 N/2×M/2인 4개의 부분 배열로 나눠야 한다. 아래 그림은 크기가 6×8인 배열을 4개의 그룹으로 나눈 것이고, 1부터 4까지의 수로 나타냈다.

5번 연산은 1번 그룹의 부분 배열을 2번 그룹 위치로, 2번을 3번으로, 3번을 4번으로, 4번을 1번으로 이동시키는 연산이다.

6번 연산은 1번 그룹의 부분 배열을 4번 그룹 위치로, 4번을 3번으로, 3번을 2번으로, 2번을 1번으로 이동시키는 연산이다.

3. 제약사항

4. 입력

첫째 줄에 배열의 크기 N, M과 수행해야 하는 연산의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.

마지막 줄에는 수행해야 하는 연산이 주어진다. 연산은 공백으로 구분되어져 있고, 문제에서 설명한 연산 번호이며, 순서대로 적용시켜야 한다.

 

5. 출력

입력으로 주어진 배열에 R개의 연산을 순서대로 수행한 결과를 출력한다.

 

6. 풀이

- 상하반전, 좌우반전, 오른쪽 90도 회전, 왼쪽 90도 회전, 배열 분할 이동 2번을 하면 된다.

- transMap이라는 2차원 배열을 생성하여 map의 값을 입력하고 다시 map에 저장한다.

 

- 1번 상하반전 : N-i-1을 이용하여 상하반전

 

- 2번 좌우반전 : M-j-1을 이용하여 좌우 반전

 

- 3번 오른쪽 90도 회전 : 오른쪽 90도 회전은 int C를 이용하여 회전하고, 크기를 변환해줘야 한다. 여러 연산의 수가 나오면 에러 발생.

 

- 4번 왼쪽 90도 회전 : 오른쪽 90도 회전은 int Row를 이용하여 회전하고, 크기를 변환해줘야 한다. 여러 연산의 수가 나오면 에러 발생.

 

- 5번 배열 분할 이동 : 행의 중앙값(N_mid), 열의 중앙값(M_mid)를 만들어 분할 이동

 

- 6번 배열 분할 이동 : 행의 중앙값(N_mid), 열의 중앙값(M_mid)를 만들어 분할 이동

 

7. 소스 코드

import java.util.*;

public class Main {
	static int N; //배열크기 행
	static int M; //배열크기 열
	static int R; //연산의 수
	static int[][] map; //배열
	static int[][] transMap; // 결과 저장 배열
	static int num; //연산번호
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt(); //배열크기 행
		M = sc.nextInt(); //배열크기 열
		R = sc.nextInt(); //연산의 수
		map = new int[N][M]; //배열
		
		//배열값 입력
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				map[i][j] = sc.nextInt();
			}
		}
		
		
		//연산의 수만큼 반복
		for(int i=0;i<R;i++) {
			num = sc.nextInt(); //연산번호
			
			switch(num) {
			//상하반전
			case 1 : 
				upDown();
				break;
				
			//좌우반전
			case 2 : 
				leftRight();
				break;
				
			//오른쪽 90도 회전
			case 3 :
				rightRotation();
				break;
				
			//왼쪽 90도 회전
			case 4 : 
				leftRotation();
				break;
				
			//1->2, 2->3, 3->4, 4->1 이동
			case 5 : 
				fiveMove();
				break;
				
			//1->4, 4->3, 3->2, 2->1 이동
			case 6 : 
				sixMove();
				break;
			}
		}
		
		//배열 결과 출력
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}
	}
	
	//상하반전 1
	public static void upDown() {
		int[][] transMap = new int[N][M]; //결과 저장 배열
		
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				//N-i-1을 하면 거꾸로 입력이 된다.
				transMap[N-i-1][j] = map[i][j];
			}
		}
		map = transMap;
	}
	
	//좌우반전 2
	public static void leftRight() {
		transMap = new int[N][M]; //결과 저장 배열
		
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				//M-j-1을 하면 맨 뒤의 열부터 채워진다.
				transMap[i][M-j-1] = map[i][j];
			}
		}
		map = transMap;
	}
	
	//오른쪽 90도 회전 3
	public static void rightRotation() {
		transMap = new int[M][N]; //결과 저장 배열
		
		int C = N-1;
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				transMap[j][C] = map[i][j];
			}
			C--;
		}
		
		//크기 변환
		int temp = N;
		N = M;
		M = temp;
		
		map = transMap;
	}
	
	//왼쪽 90도 회전 4
	public static void leftRotation() {
		transMap = new int[M][N]; //결과 저장 배열
		
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				transMap[M-j-1][i] = map[i][j];
			}
		}
		
		//크기 변환
		int temp = N;
		N = M;
		M = temp;
		
		map = transMap;
	}
	
	//1->2, 2->3, 3->4, 4->1 이동 5
	public static void fiveMove() {
		transMap = new int[N][M]; //결과 저장 배열
		
		int N_mid = N/2; //행 중앙값
		int M_mid = M/2; //열 중앙값

		//1->2
		for(int i=0;i<N_mid;i++) {
			for(int j=0;j<M_mid;j++) {
				transMap[i][M_mid+j] = map[i][j];
			}
		}
		
		//2->3
		for(int i=0;i<N_mid;i++) {
			for(int j=M_mid;j<M;j++) {
				transMap[N_mid+i][j] = map[i][j];
			}
		}
		
		//3->4
		for(int i=N_mid;i<N;i++) {
			int C = 0;
			for(int j=M_mid;j<M;j++,C++) {
				transMap[i][C] = map[i][j];
			}
		}
		
		//4->1
		
		int Row = 0;
		
		for(int i=N_mid;i<N;i++, Row++) {
			for(int j=0;j<M_mid;j++) {
				transMap[Row][j] = map[i][j];
			}
		}
		map = transMap;
	}
	
	//1->4, 4->3, 3->2, 2->1 이동 6
	public static void sixMove() {
		transMap = new int[N][M]; //결과 저장 배열
		
		int N_mid = N/2; //행 중앙값
		int M_mid = M/2; //열 중앙값

		//1->4
		for(int i=0;i<N_mid;i++) {
			for(int j=0;j<M_mid;j++) {
				transMap[N_mid+i][j] = map[i][j];
			}
		}
		
		//4->3
		for(int i=N_mid;i<N;i++) {
			for(int j=0;j<M_mid;j++) {
				transMap[i][M_mid+j] = map[i][j];
			}
		}
		
		//3->2
		int Row = 0;
		for(int i=N_mid;i<N;i++,Row++) {
			for(int j=M_mid;j<M;j++) {
				transMap[Row][j] = map[i][j];
			}
		}
		
		//2->1
		for(int i=0;i<N_mid;i++) {
			int C = 0;
			for(int j=M_mid;j<M;j++,C++) {
				transMap[i][C] = map[i][j];
			}
		}
		map = transMap;
	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기