순간을 성실히, 화려함보단 꾸준함을

[ boj : 21608 ] 상어 초등학교 본문

알고리즘,SQL/백준,BOJ

[ boj : 21608 ] 상어 초등학교

폭발토끼 2022. 1. 28. 23:47

https://www.acmicpc.net/problem/21608

 

21608번: 상어 초등학교

상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호

www.acmicpc.net

해설 : 문제만 읽어도 누가봐도 삼성 빡구현 문제죠??ㅎㅎㅎ

보면 조건에 맞게 전부 if 문 덕지덕지 발라야되나??하는 생각이 들수 있는데 이런 문제는 깔끔하게 연산자로 비교해주면 됩니다.

c++ 이라면 연산자 오버로딩을, java 라면 Comparable 인터페이스 또는 Comparator 인터페이스를 사용해서 적절하게 처리를 해주면 됩니다. 가장 최우선인 자리에 배치를 해야되니 priority_queue 를 사용해서 top 에 있는 원소만 뽑으면 되겠죠?

다만 구현부분에서 살짝 뇌정지가 올법한데 주의할 점은 학생을 채우면서 점수를 계산하는 것이 아닌 학생을 자리에 전부 앉힌 이후에 점수를 계산해야 된다는 점입니다.

그것만 조심해서 잘 구현해주면 문제없이 답을 도출 하실 수 있으실 겁니다.

//package com.example.bojtemplate;

/*JAVA IO Template Reference : 류호석*/

import java.io.*;
import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;

public class Main {
    private static FastIO scan = new FastIO();

    public static void main(String[] args) throws IOException{
        //int t;
        //t = scan.nextInt();
        //while(t-->0){
            solve();
        //}
    }
    public static void solve() throws IOException{
        int n;
        int []pos = new int[4];
        int []dx={-1,1,0,0};
        int []dy={0,0,-1,1};
        int [][]board = new int[410][410];
        Map<Integer,List<Integer>> mp = new HashMap<>();

        n = scan.nextInt();
        PriorityQueue<Info> pq = new PriorityQueue<>();
        for(int i=0;i<n*n;i++){
            int x = scan.nextInt();
            List<Integer> list = new ArrayList<>();
            for(int j=0;j<4;j++){
                pos[j] = scan.nextInt();
                list.add(pos[j]);
            }
            mp.put(x,list);
            for(int j=1;j<=n;j++){
                for(int k=1;k<=n;k++){
                    if(board[j][k]!=0)continue;

                    int like=0,empty=0;
                    for(int p=0;p<4;p++){
                        int tx = j+dx[p];
                        int ty = k+dy[p];
                        int cnt=0;

                        if(tx<=0 || tx>n || ty<=0 || ty>n)continue;

                        for(int q=0;q<4;q++){
                            if(board[tx][ty]==pos[q]){
                                cnt++;
                                break;
                            }
                        }
                        if(cnt>0)like++;
                        else if(board[tx][ty]==0 && cnt<=0)empty++;
                    }
                    pq.add(new Info(like,empty,j,k));
                }
            }
            Info cur = pq.poll();
            board[cur.x][cur.y]=x;
            pq.clear();
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                int cnt=0;
                for(int k=0;k<4;k++){
                    int tx = i + dx[k];
                    int ty = j + dy[k];

                    if(tx<=0 || tx>n || ty<=0 || ty>n)continue;

                    for(int u : mp.get(board[i][j]))
                        if(u==board[tx][ty])
                            cnt++;
                }
                if(cnt==1)ans+=1;
                else if(cnt==2) ans +=10;
                else if(cnt==3)ans+=100;
                else if(cnt==4)ans+=1000;
            }
        }
        System.out.println(ans);
    }
}
class Info implements Comparable<Info>{
    int cnt,box;
    int x,y;

    public Info(int cnt, int box, int x, int y) {
        this.cnt = cnt;
        this.box = box;
        this.x = x;
        this.y = y;
    }

    @Override
    public int compareTo(Info o) {
        if(cnt==o.cnt){
            if(box==o.box){
                if(x==o.x)
                    return y>o.y?1:-1;
                return x>o.x?1:-1;
            }
            return box<o.box?1:-1;
        }
        return cnt<o.cnt?1:-1;
    }
}
class FastIO{
    BufferedReader br;
    BufferedWriter bw;
    StringTokenizer st;

    public FastIO(){
        br = new BufferedReader(new InputStreamReader(System.in));
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
    }
    void write(String str) throws IOException{
        bw.write(str);
    }
    void flush() throws IOException{
        bw.flush();
    }
    int nextInt(){
        return Integer.parseInt(next());
    }
    double nextDouble(){
        return Double.parseDouble(next());
    }
    Long nextLong(){
        return Long.parseLong(next());
    }
    String nextLine(){
        String str="";
        try{
            str = br.readLine();
        }catch (IOException e){
            e.printStackTrace();
        }
        return str;
    }
    String next() {
        while (st == null || !st.hasMoreElements()) {
            try {
                st = new StringTokenizer(br.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return st.nextToken();
    }
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[ boj : 2799 ] 블라인드  (0) 2022.01.31
[ boj : 16507 ] 어두운 건 무서워  (0) 2022.01.29
[ boj : 2343 ] 기타 레슨  (0) 2022.01.28
[ boj : 22868 ] 산책(small)  (0) 2022.01.26
[ boj : 22942 ] 데이터 체커  (0) 2022.01.22