알고리즘 공부/문제 풀이

[JAVA] SWEA 1767 프로세서 연결하기

valid_ming 2021. 9. 18. 13:00
 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제는 위 링크와 풀이의 문제 분석을 참고해주세요.

 

풀이

해결 전략은 문제를 풀며 적은 내용으로 실제 작성한 코드와 상이할 수 있습니다.
변경된 부분은 왜 변경했는지 풀이 후기에 적어 놓았으니 참고 바랍니다!

 

코드

import java.util.*;
import java.io.*;

public class Solution {
	
	static int N, coreCnt;
	static int[][] MAP;
	static int answer = 10000, CON = 0;
	static ArrayList<Integer[]> cores;
	static int[][] d = {{-1, 1, 0, 0}, {0, 0, -1, 1}};

	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		
		for(int t=1;t<=T;t++) {
            answer = 10000;
            CON = 0;
			N = Integer.parseInt(br.readLine());
			MAP = new int[N][N];
			cores = new ArrayList<>();
			
			for(int i=0;i<N;i++) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				for(int j=0;j<N;j++) {
					int val = Integer.parseInt(st.nextToken());
					MAP[i][j] = val;
					if(val==1 && !(i==0 || j==0 || i==N-1 || j==N-1)) cores.add(new Integer[] {i, j});
				}
			}
			
			coreCnt = cores.size();
			perm(MAP, 0, 0, 0);
			
			System.out.println("#"+t+" "+answer);
		}
	}
	
	public static void perm(int[][] map, int sum, int cnt, int con) {
		if(cnt==coreCnt) {
			if(CON < con) {
				CON = con;
				answer = sum;
			}
			if(CON == con &&  sum < answer) {
				answer = sum;
			}
			return;
		}
		
		//남은 core 모두 연결해도 answerCnt보다 작은 경우
		//if(con+(coreCnt-cnt) < CON) return;
		
		for(int i=0; i<4;i++) {
			int[][] newMap = cloneMap(map);
			int len = linkCore(newMap, cores.get(cnt), i); 
			if(len>0) perm(newMap, sum+len, cnt+1, con+1);
		}
		 perm(map, sum, cnt+1, con);
	}
	
	public static int linkCore(int[][] map, Integer[] pos, int dir) {
		int len = 0;

		int nr = pos[0];
		int nc = pos[1];
		
		while(true) {
			nr += d[0][dir];
			nc += d[1][dir];
			if(nr<0 || nr>=N || nc<0 || nc>=N) break;
			len++;			
			if(map[nr][nc]>0) {
				len = -1;
				break;
			}
		}
		
		if(len!=-1) {
			nr = pos[0];
			nc = pos[1];
			
			while(true) {
				nr += d[0][dir];
				nc += d[1][dir];
				if(nr<0 || nr>=N || nc<0 || nc>=N) break;
				map[nr][nc] = 2;
			}
		}
		
		return len;
	}
	
	public static int[][] cloneMap(int[][] map) {
		int[][] newMap = new int[N][N];
		for(int i=0;i<N;i++) newMap[i] = map[i].clone();
		
		return newMap;
	}

}