SWEA-프로세서 연결하기(실패)
2020-04-04
SWEA의 프로세서 연결하기 문제를 풀어보고자 했습니다.
[제약 사항]
-
7 ≤ N ≤ 12
-
Core의 개수는 최소 1개 이상 12개 이하이다.
-
최대한 많은 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에서 많이 틀렸습니다.
확실히 어려웠습니다.
오랫동안 고민했는데 실패라니.. 더 공부해야겠습니다.
내일 다시풀어봐야겠습니다.