ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 배열 돌리기 4
    Algorithm/BOJ 2020. 2. 8. 15:24

    [17405] 배열 돌리기 4

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

    • 배열 A와 사용 가능한 회전 연산이 주어졌을 때, 배열 A의 값의 최솟값을 구하는 문제
    • 회전 연산은 모두 한 번씩 사용해야 하며, 순서는 임의로 정해도 된다.

     

     

    Solution

    • permuation() 함수를 돌려 회전 순서를 바꿔가면서 simulation한다.
    • 어렵다 T.T

     

     

    소스코드

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    import java.util.StringTokenizer;
    
    public class Main {
    	static int n, m, k, min = Integer.MAX_VALUE;
    	static int[] dx = { 1, 0, -1, 0 };
    	static int[] dy = { 0, 1, 0, -1 };
    	static int[][] origin;
    	static int[][] copy;
    	static int[] list;
    	static boolean[] c;
    	static List<Node> nodeList;
    
    	static class Node {
    		int r, c, s;
    
    		public Node(int r, int c, int s) {
    			this.r = r;
    			this.c = c;
    			this.s = s;
    		}
    	}
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		StringTokenizer st = new StringTokenizer(sc.nextLine());
    		n = stoi(st.nextToken());
    		m = stoi(st.nextToken());
    		k = stoi(st.nextToken());
    		origin = new int[n + 1][m + 1];
    		copy = new int[n + 1][m + 1];
    		for (int i = 1; i <= n; i++) {
    			st = new StringTokenizer(sc.nextLine());
    			for (int j = 1; j <= m; j++) {
    				origin[i][j] = stoi(st.nextToken());
    			}
    		}
    
    		nodeList = new ArrayList<>();
    		for (int i = 0; i < k; i++) {
    			st = new StringTokenizer(sc.nextLine());
    			nodeList.add(new Node(stoi(st.nextToken()), stoi(st.nextToken()), stoi(st.nextToken())));
    		}
    
    		list = new int[k];
    		c = new boolean[k];
    		permutation(0, 0);
    		System.out.println(min);
    
    	}
    	private static void print() {
    		for (int i = 1; i <= n; i++) {
    			for (int j = 1; j <= m; j++) {
    				System.out.print(copy[i][j] + " ");
    			}
    			System.out.println();
    		}
    		System.out.println("-------------");
    	}
    
    
    
    	public static void rotate(int x, int y, int s) {
    		for (int i = 1; i <= s; i++) {
    			int sx = x - i;
    			int sy = y - i;
    			int value = copy[sx][sy];
    			int dir = 0;
    			
    			while (dir < 4) {
    			int	nx = sx + dx[dir];
    			int	ny = sy + dy[dir];
    
    				if (nx >= x - i && ny >= y - i && nx <= x + i && ny <= y + i) {
    					copy[sx][sy] = copy[nx][ny];
    					sx = nx;
    					sy = ny;
    				} else {
    					dir++;
    				}
    			}
    			copy[x - i][y - i + 1] = value;
    		}
    	}
    
    	public static void simulation() {
    		copyArray();
    		for (int i : list) {
    			rotate(nodeList.get(i).r, nodeList.get(i).c, nodeList.get(i).s);
    		}
    		min = Math.min(min, calc());
    	}
    
    	public static void permutation(int depth, int start) {
    		if (depth == k) {
    			simulation();
    			return;
    		}
    
    		for (int i = 0; i < k; i++) {
    			if (!c[i]) {
    				c[i] = true;
    				list[depth] = i;
    				permutation(depth + 1, i + 1);
    				c[i] = false;
    			}
    		}
    	}
    
    	public static int calc() {
    		int result = Integer.MAX_VALUE;
    		for (int i = 1; i <= n; i++) {
    			int sum = 0;
    			for (int j = 1; j <= m; j++) {
    				sum += copy[i][j];
    			}
    			result = Math.min(result, sum);
    		}
    
    		return result;
    	}
    
    	public static void copyArray() {
    		for (int i = 1; i <= n; i++) {
    			for (int j = 1; j <= m; j++) {
    				copy[i][j] = origin[i][j];
    			}
    		}
    	}
    
    	public static int stoi(String s) {
    		return Integer.parseInt(s);
    	}
    }

    'Algorithm > BOJ' 카테고리의 다른 글

    [BOJ] 연구소 2  (0) 2020.02.08
    [BOJ] 치킨 배달  (0) 2020.02.08
    [BOJ] DSLR  (0) 2020.02.07
    [BOJ] 숨바꼭질 2  (0) 2020.02.07
    [BOJ] 숨바꼭질 4  (0) 2020.02.06

    댓글

Designed by Tistory.