https://www.acmicpc.net/problem/21608
한 칸씩 조건에 맞게 채워나가면 된다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringTokenizer st;
static int N, answer = 0;
static int[] input;
static int[][] f, map;
static int[][] dir = { { 1, -1, 0, 0 }, { 0, 0, -1, 1 } };
static void setSeat() {
map[1][1] = input[0];
for(int i = 1; i < N * N; i++) {
int max = Integer.MIN_VALUE;
int x = -1, y = -1;
int student = input[i];
for(int j = 0; j < N; j++) {
for(int k = 0; k < N; k++) {
if(map[j][k] != 0) {
continue;
}
int score = 0;
for(int d = 0; d < 4; d++) {
int nX = j + dir[0][d];
int nY = k + dir[1][d];
if(nX < 0 || nX >= N || nY < 0 || nY >= N)continue;
if(map[nX][nY] == 0) {
score++;
}
for(int l = 0; l < 4; l++) {
if(map[nX][nY] == f[student][l]) score += 5;
}
}
if(score > max) {
max = score;
x = j;
y = k;
}
}
}
map[x][y] = student;
}
}
static void countSatisfaction() {
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
int cnt = 0;
int student = map[i][j];
for(int d = 0; d < 4; d++) {
int nX = i + dir[0][d];
int nY = j + dir[1][d];
if(nX < 0 || nX >= N || nY < 0 || nY >= N)continue;
for(int l = 0; l < 4; l++) {
if(map[nX][nY] == f[student][l]) cnt++;
}
}
if(cnt == 1) {
answer++;
}else if (cnt == 2){
answer += 10;
}else if(cnt == 3) {
answer += 100;
}else if(cnt == 4) {
answer += 1000;
}
}
}
}
public static void main(String[] args) throws IOException {
N = Integer.parseInt(br.readLine());
input = new int[N * N];
f = new int[N * N + 1][4];
map = new int[N][N];
for (int i = 0; i < N * N; i++) {
st = new StringTokenizer(br.readLine());
input[i] = Integer.parseInt(st.nextToken());
for (int j = 0; j < 4; j++) {
f[input[i]][j] = Integer.parseInt(st.nextToken());
}
}
setSeat();
countSatisfaction();
bw.append(answer + "");
bw.flush();
}
}