ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] SWEA 1767 프로세서 연결하기
    알고리즘 공부/문제 풀이 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;
    	}
    
    }

    댓글

Designed by Tistory.