문제 - 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

+ Recent posts