BJ21608 상어 초등학교

·2022년 4월 23일
0

백준 알고리즘

목록 보기
31/34

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();
	}
}
profile
SSAFY 7기

0개의 댓글