비버놀로지

[BAEKJOON 백준] 17406 배열돌리기 4 본문

ALGORITM/JAVA

[BAEKJOON 백준] 17406 배열돌리기 4

KUNDUZ 2020. 8. 31. 01:33
728x90

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

 

17406번: 배열 돌리기 4

크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의

www.acmicpc.net

배열과 좌표를 이용해서 배열을 돌리는 문제입니다.

 

그리고 좌표는 수열을 통해서 나열을 해야하고, 그렇게 나열한 배열을 돌려서 얻은 배열을 통해 답을 찾는다.

 

 

import java.util.Scanner;

public class Main {

	static class Point { // 회전할 좌표와 횟수 저장할 클래스
		int x, y, z;

		public Point(int x, int y, int z) {
			super();
			this.x = x;
			this.y = y;
			this.z = z;
		}

	}

	static boolean visit[];
	static int K, N, M;
	static Point cal[];
	static int arr[][];
	static int temparr[][]; // 복사한 배열하나 만들기

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		N = sc.nextInt();
		M = sc.nextInt();
		K = sc.nextInt();
		temp = new Point[K];
		visit = new boolean[K];
		cal = new Point[K];
		arr = new int[N + 1][M + 1];
		temparr = new int[N + 1][M + 1];
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= M; j++) {
				arr[i][j] = sc.nextInt();
			}
		}
		for (int i = 0; i < K; i++) {
			cal[i] = new Point(sc.nextInt(), sc.nextInt(), sc.nextInt());
		}

		solve(0);
		System.out.println(answer);
	}

	static Point temp[];
	static int answer = Integer.MAX_VALUE;

	private static void solve(int cnt) { // 순열을 이용해서 좌표를 나열
		// TODO Auto-generated method stub
		if (cnt == K) { // 순열로 나열된 좌표를 통해서 회전시키기
			for (int i = 1; i <= N; i++) {
				for (int j = 1; j <= M; j++) {
					temparr[i][j] = arr[i][j]; // 배열 복사하기
				}
			}
			rotate(temp); // 회전시키기
			for (int i = 1; i <= N; i++) { // 회전시킨 배열을 이용해서 답찾기
				int result = 0;
				for (int j = 1; j <= M; j++) {
					result += temparr[i][j];
				}
				if (answer > result) { // 최소값을 찾는다.
					answer = result;
				}
			}
			return;
		}

		for (int i = 0; i < K; i++) { // 수열로 나열하기
			if (visit[i])
				continue;
			temp[cnt] = cal[i];
			visit[i] = true;
			solve(cnt + 1);
			visit[i] = false;
		}
	}

	private static void rotate(Point[] temp) { // 회전시키기
		// TODO Auto-generated method stub
		for (int k = 0; k < K; k++) { // 좌표의 개수

			Point p = temp[k];
			for (int i = 1; i <= p.z; i++) { // 회전할 배열량
				int ptype = -1;
				for (int y = p.y - i; y <= p.y + i; y++) { // 위쪽
					if (ptype == -1) {
						ptype = temparr[p.x - i][y];

					} else {
						int temp1 = ptype;
						ptype = temparr[p.x - i][y];
						temparr[p.x - i][y] = temp1;
					}
				}
				for (int x = p.x - i + 1; x <= p.x + i; x++) { // 오른쪽
					int temp1 = ptype;
					ptype = temparr[x][p.y + i];
					temparr[x][p.y + i] = temp1;
				}
				for (int y = p.y + i - 1; y >= p.y - i; y--) { // 왼쪽
					int temp1 = ptype;
					ptype = temparr[p.x + i][y];
					temparr[p.x + i][y] = temp1;
				}
				for (int x = p.x + i - 1; x >= p.x - i; x--) { // 아래쪽
					int temp1 = ptype;
					ptype = temparr[x][p.y - i];
					temparr[x][p.y - i] = temp1;
				}
			}
		}
	}

}
728x90

'ALGORITM > JAVA' 카테고리의 다른 글

[SWEA SW Expert Academy] 1249 보급로  (0) 2020.12.01
[SWEA SW Expert Academy] 4013 특이한 자석  (0) 2020.12.01
[BAEKJOON 백준] 1992 쿼드트리  (0) 2020.08.30
[BAEKJOON 백준] 15686 치킨 배달  (0) 2020.08.30
[BAEKJOON 백준] 1074 Z  (0) 2020.08.30
Comments