λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/BOJ

[BOJ] 경쟁적 μ „μ—Ό(18405)

[λ°±μ€€(BOJ)] 18405_경쟁적 μ „μ—Ό JAVA

문제 : BOJ_18405번 경쟁적 μ „μ—Ό

문제 μ„€λͺ…

NxN 크기의 μ‹œν—˜κ΄€μ—μ„œ λ°”μ΄λŸ¬μŠ€κ°€ 맀초 μƒν•˜μ’Œμš°λ‘œ μ¦μ‹ν•œλ‹€.

μ΄λ•Œ λ°”μ΄λŸ¬μŠ€λŠ” 기쑴의 λ°”μ΄λŸ¬μŠ€κ°€ μžˆλŠ” μžλ¦¬μ—” 증식할 수 μ—†μœΌλ©° λ°”μ΄λŸ¬μŠ€λ§ˆλ‹€ μ¦μ‹ν•˜λŠ” μš°μ„ μˆœμœ„ λ²ˆν˜Έκ°€ 주어진닀.

μ£Όμ–΄μ§€λŠ” μ‹œκ°„(s)에 μ£Όμ–΄μ§€λŠ” μž₯μ†Œ(x,y)에 μ–΄λ–€ λ°”μ΄λŸ¬μŠ€κ°€ μžˆλŠ”μ§€ 좜λ ₯ν•˜λŠ” λ¬Έμ œμ΄λ‹€.


Solution

bfs

bfsλ₯Ό μ΄μš©ν•΄μ„œ λ°”μ΄λŸ¬μŠ€κ°€ μƒν•˜μ’Œμš°λ‘œ 증식할 λ•Œ μžλ£Œκ΅¬μ‘°μ— λ„£μ–΄μ§€λŠ” μ‹μœΌλ‘œ ν’€ 수 μžˆλ‹€.

λ‹€λ§Œ, λ°”μ΄λŸ¬μŠ€κ°€ μ¦μ‹ν•˜λŠ” μš°μ„ μˆœμœ„ λ²ˆν˜Έκ°€ 있기 λ•Œλ¬Έμ— λ‹¨μˆœν•œ queue κ΅¬μ‘°λ‘œλŠ” ν•΄κ²°ν•  수 μ—†λ‹€.

μ—¬λŸ¬ 가지 방법이 μžˆμ§€λ§Œ temp listλ₯Ό μ„ μ–Έν•΄μ„œ μƒˆλ‘œ μƒμ„±λ˜λŠ” λ°”μ΄λŸ¬μŠ€λ“€μ„ λ„£μ–΄μ€€ λ’€, ν•œ 번의 λ°”μ΄λŸ¬μŠ€ 증식이 λλ‚œ 뒀에 기쑴의 listλ₯Ό temp list둜 λ°”κΏ”μ£Όκ³  μ •λ ¬ν•˜λŠ” μ‹μœΌλ‘œ ν•΄κ²°ν–ˆλ‹€.

μ£Όμ˜ν•  것은 sμ΄ˆκ°€ 되기 전에 bfsκ°€ λλ‚˜λŠ” κ²½μš°κ°€ μžˆμœΌλ‹ˆ 이 μ—­μ‹œ κ³ λ €ν•΄ μ€˜μ•Ό ν•œλ‹€.


Description

  • λ°”μ΄λŸ¬μŠ€μ˜ μ’Œν‘œμ™€ μš°μ„ μˆœμœ„λŠ” NodeλΌλŠ” 클래슀둜 λ‹΄μ•˜λ‹€.
  • list = tempλΌλŠ” μ½”λ“œλ‘œ 기쑴의 리슀트λ₯Ό temp 리슀트둜 κ΅μ²΄ν•œλ‹€.
  • if(!printAns) bw.write(String.valueOf(map[x][y])+"\n"); : sμ΄ˆκ°€ 되기 전에 bfsκ°€ μ’…λ£Œλ˜λŠ” κ²½μš°μ— μ‹€ν–‰λ˜λŠ” μ½”λ“œμ΄λ‹€.

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

class Node implements Comparable<Node>{
    private int x;
    private int y;
    private int val;

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getVal() {
        return val;
    }

    public Node(int x, int y, int val){
        this.x = x;
        this.y = y;
        this.val = val;
    }

    @Override
    public int compareTo(Node other) {
        return Integer.compare(this.val, other.val);
    }
}

public class Main {
    public static int[][] map;
    public static ArrayList<Node> list = new ArrayList<>();
    public static int n,k, s, x, y;
    public static int[] dx = {0,0,-1,1};
    public static int[] dy = {1,-1,0,0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        map = new int[n+1][n+1];

        for(int i=1; i<=n; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=1; j<=n; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
                if(map[i][j] != 0) list.add(new Node(i,j,map[i][j]));
            }
        }

        st = new StringTokenizer(br.readLine());
        s = Integer.parseInt(st.nextToken());
        x = Integer.parseInt(st.nextToken());
        y = Integer.parseInt(st.nextToken());
        int sec = 0;
        boolean printAns = false;
        while (!list.isEmpty()){
            if(sec == s) {
                bw.write(String.valueOf(map[x][y])+"\n");
                printAns = true;
            }
            int size = list.size();
            Collections.sort(list);
            ArrayList<Node> temp = new ArrayList<>();
            for(int i=0; i<size; i++){
                Node node = list.get(i);
                int x = node.getX();
                int y = node. getY();

                for(int j=0; j<4; j++){
                    int nx = x + dx[j];
                    int ny = y + dy[j];
                    if(nx<1 || ny < 1 || nx > n || ny > n) continue;
                    if(map[nx][ny]!=0) continue;
                    map[nx][ny] = node.getVal();
                    temp.add(new Node(nx,ny,node.getVal()));
                }
            }
            sec++;
            list = temp;
        }
        if(!printAns) bw.write(String.valueOf(map[x][y])+"\n");
        bw.flush();
        br.close();
        bw.close();
    }
}

'Algorithm > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] 보석 쀍기(2001)  (0) 2022.03.17
[BOJ] LCS 2(9252)  (0) 2022.03.16
[BOJ] μΉ˜ν‚¨ 배달(15686)  (0) 2022.03.16
[BOJ] μ•„κΈ° 상어(16236)  (0) 2022.03.15
[BOJ] ν–‰μ„± 터널(2887)  (0) 2022.03.15