문제 - https://www.acmicpc.net/problem/21608
21608번: 상어 초등학교
상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호
www.acmicpc.net
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, 1, 0, -1};
static int[][] map;
static Set[] friend;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
map = new int[N][N];
friend = new Set[N*N+1];
for (int i = 0; i < N*N; i++) {
st = new StringTokenizer(br.readLine());
int id = Integer.parseInt(st.nextToken());
friend[id] = new HashSet();
for (int j = 0; j < 4; j++) {
friend[id].add(Integer.parseInt(st.nextToken()));
}
fill(id);
}
bw.write(calc()+"\n");
bw.flush();
bw.close();
br.close();
}
static void fill(int id){
int empty = 0;
int like = 0;
int row = 0;
int col = 0;
for (int i = N-1; i >= 0; i--) {
for (int j = N-1; j >= 0; j--) {
if (map[i][j]==0){ // 빈자리면
int tmp_empty = 0;
int tmp_like = 0;
for (int w = 0; w < 4; w++) { // 4방향 돌면서
int nr = i + dr[w];
int nc = j + dc[w];
if(0<=nr && nr<N && 0<=nc && nc<N){ // 교실안에있으면
if (map[nr][nc]==0) // 빈자리 수 세고
tmp_empty++;
else if (friend[id].contains(map[nr][nc])) // 좋아하는 학생 수 세고
tmp_like++;
}
}
if ((tmp_like > like) || (tmp_like == like && tmp_empty >= empty)){ // 좋아하는 학생 수가 더 많거나, 같은데 빈자리수가 같거나 더 많으면 위치 갱신 위치 새로 갱신
like = tmp_like;
empty = tmp_empty;
row = i;
col = j;
}
}
}
}
map[row][col] = id;
}
static int calc(){
int score = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int cnt = 0;
int id = map[i][j];
for (int k = 0; k < 4; k++) {
int nr = i+dr[k];
int nc = j+dc[k];
if (0<=nr && nr<N && 0<=nc && nc<N && friend[id].contains(map[nr][nc]))
cnt++;
}
score += cnt > 0 ? Math.pow(10, cnt-1) : 0;
}
}
return score;
}
}
특별할 것 없는 단순 구현문제였다.
다만, Python이 Java보다 더 퍼포먼스가 좋은 것 같은데.. 이유는 잘 모르겠다!
'공부 > algorithm' 카테고리의 다른 글
BOJ 상어 중학교(21609) - Java (0) | 2021.09.02 |
---|---|
BOJ 경사로(14890) - Java (0) | 2021.09.02 |
BOJ 전구(2449) - Java (0) | 2021.08.25 |
BOJ 제단(5626) - Java (0) | 2021.08.25 |
BOJ 연구소(14502) - Java (0) | 2021.08.24 |