SWEA-프로세서 연결하기(실패)

2020-04-04

SWEA의 프로세서 연결하기 문제를 풀어보고자 했습니다.


SWEA-프로세서 연결하기

[제약 사항]

  1. 7 ≤ N ≤ 12

  2. Core의 개수는 최소 1개 이상 12개 이하이다.

  3. 최대한 많은 Core에 전원을 연결해도, 전원이 연결되지 않는 Core가 존재할 수 있다.

[입력]

입력의 가장 첫 줄에는 총 테스트 케이스의 개수 T가 주어지며 그 다음 줄부터 각 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 줄에는 N값이 주어지며, 다음 N줄에 걸쳐서 멕시노스의 초기 상태가 N x N 배열로 주어진다.

0은 빈 cell을 의미하며, 1은 core를 의미하고, 그 외의 숫자는 주어지지 않는다.

[출력]

각 테스트 케이스마다 ‘#X’를 찍고, 한 칸 띄고, 정답을 출력한다.

(X는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main{
	static class Point{
		int x;
		int y;
		Point(int x, int y){
			this.x = x;
			this.y = y;
		}
	}
	static int N;
	static int[][] map;
	static int[] dx= {1,-1,0,0};
	static int[] dy= {0,0,1,-1};
	static ArrayList<Point> list;
	static int min = Integer.MAX_VALUE;
	static int max = Integer.MIN_VALUE;
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int testCase = scanner.nextInt();
		
		for(int i = 0; i < testCase; i++)
		{
			N = scanner.nextInt();
			
			map = new int[N][N];
			list = new ArrayList<>();
			
			for(int j = 0 ; j < N; j ++)
			{
				for(int k = 0 ; k < N; k++)
				{
					map[j][k] = scanner.nextInt();
					if(map[j][k]==1)
					{
						if(j -1 < 0 || k-1 < 0 || j + 1 >= N || k + 1>= N)
							continue;
						list.add(new Point(j,k));
					}
				}
			}
			dfs(0,0,0);
			
			System.out.println("#" + i+1 + " " + min);
		}
	}
	public static void dfs(int index, int coreCount, int length) {
		if(index == list.size()) {
			if(max < coreCount) {
				max = coreCount;
				min = length;
			}
			else if (max == coreCount) {
				if(min > length) min = length;
			}
			return;
		}
		int x= list.get(index).x;
		int y= list.get(index).y;
		for(int direction =0; direction < 4; direction++)
		{
			int count = 0;
			int nextX = x;
			int nextY = y;
			int originX = x;
			int originY = y;
			while(true) {
				nextX += dx[direction];
				nextY += dy[direction];
				
				if(nextY < 0 || nextX < 0 || nextY>= N || nextX >=N) {
					break;
				}
				if(map[nextX][nextY]==1)
				{
					count = 0;
					break;
				}
				count ++;
			}
			for(int i = 0 ; i < count; i++)
			{
				originX +=dx[direction];
				originY +=dy[direction];
				
				map[originX][originY] =1;
			}
			if(count == 0)
			{
				dfs(index+1, coreCount,length);
			}
			else {
				dfs(index +1, coreCount+1,length+count);
				
				originX =x;
				originY =y;
				for(int i = 0; i < count; i++) {
					originX += dx[direction];
					originY += dy[direction];
					
					map[originX][originY] = 0;
				}
			}
		}
		
	}
}

DFS와 시뮬레이션 문제로, 풀어보고자 했는데 inputSample값은 출력이 되지만 testCase에서 많이 틀렸습니다.

확실히 어려웠습니다.

오랫동안 고민했는데 실패라니.. 더 공부해야겠습니다.

내일 다시풀어봐야겠습니다.