์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[ BOJ / ๋ฐฑ์ค€ 20165 ] ์ธ๋‚ด์˜ ๋„๋ฏธ๋…ธ ์žฅ์ธ ํ˜ธ์„ ( ์ž๋ฐ” / JAVA )

KIMHYEYUN 2022. 2. 21. 19:44
๋ฐ˜์‘ํ˜•

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

 

20165๋ฒˆ: ์ธ๋‚ด์˜ ๋„๋ฏธ๋…ธ ์žฅ์ธ ํ˜ธ์„

์‚ฌ๋žŒ์„ ํ™”๋‚˜๊ฒŒ ํ•˜๋Š” ๋ฒ•์€ ๋‹ค์–‘ํ•˜๋‹ค. ๊ทธ ์ค‘์—์„œ๋„ ์•…์งˆ์€ ๋ฐ”๋กœ ์—ด์‹ฌํžˆ ์„ธ์›Œ๋†“์€ ๋„๋ฏธ๋…ธ๋ฅผ ๋„˜์–ด๋œจ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฒˆ์— ์ถœ์‹œ๋œ ๋ณด๋“œ ๊ฒŒ์ž„์ธ "๋„ˆ ์ฃฝ๊ณ  ๋‚˜ ์‚ด์ž ๊ฒŒ์ž„"์€ ๋ฐ”๋กœ ์ด ์ ์„ ์ด์šฉํ•ด์„œ 2๋ช…์ด

www.acmicpc.net

๋ฌธ์ œ ์„ค๋ช…

2๋ช…์ด ๊ณต๊ฒฉ๊ณผ ์ˆ˜๋น„๋ฅผ ํ•˜๋Š” ๊ฒŒ์ž„
๊ณต๊ฒฉ์ˆ˜๋Š” ๋„๋ฏธ๋…ธ๋ฅผ ๊ณ„์† ๋„˜์–ด๋œจ๋ฆฌ๊ณ , ์ˆ˜๋น„์ˆ˜๋Š” ๋„๋ฏธ๋…ธ๋ฅผ ๊ณ„์† ์„ธ์šด๋‹ค.

๊ฒŒ์ž„ ์ง„ํ–‰

  1. Nํ–‰ M์—ด์˜ 2์ฐจ์› ๊ฒฉ์ž ๋ชจ์–‘์˜ ๊ฒŒ์ž„ํŒ์˜ ๊ฐ ๊ฒฉ์ž์— ๋„๋ฏธ๋…ธ๋ฅผ ์„ธ์›€. (1 <= ๋„๋ฏธ๋…ธ ๋†’์ด <= 5)
  2. ๋งค ๋ผ์šด๋“œ๋Š” ๊ณต๊ฒฉ์ˆ˜๊ฐ€ ๋จผ์ € ๊ณต๊ฒฉ, ๊ทธ ํ›„ ์ˆ˜๋น„์ˆ˜๊ฐ€ ์ˆ˜๋น„๋ฅผ ํ•จ
  3. ๊ณต๊ฒฉ์ˆ˜๋Š” ํŠน์ • ๋„๋ฏธ๋…ธ๋ฅผ ๋™, ์„œ, ๋‚จ, ๋ถ ์ค‘ ์›ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋„˜์–ด๋œจ๋ฆผ
    3-1. ๊ธธ์ด K์ธ ๋„๋ฏธ๋…ธ๊ฐ€ ํŠน์ • ๋ฐฉํ–ฅ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด
    3-2. ๊ทธ ๋ฐฉํ–ฅ์˜ K-1๊ฐœ์˜ ๋„๋ฏธ๋…ธ๋“ค ์ค‘ ๋„˜์–ด์ง€์ง€ ์•Š์€ ๊ฒƒ๋“ค์€ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋„˜์–ด์ง
    3-3. ์—ฐ์‡„์ ์œผ๋กœ ๋„๋ฏธ๋…ธ๊ฐ€ ๋„˜์–ด์งˆ ์ˆ˜ ์žˆ์Œ
  4. ์ˆ˜๋น„์ˆ˜๋Š” ๋„˜์–ด์ ธ์žˆ๋Š” ๋„๋ฏธ๋…ธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ธ์šธ ์ˆ˜ ์žˆ์Œ
  5. ์ด R๋ฒˆ์˜ ๋ผ์šด๋“œ๋™์•ˆ ์ด ๊ณผ์ •์ด ๋ฐ˜๋ณต๋จ
    5-1. ๋งค ๋ผ์šด๋“œ์—์„œ ๋„˜์–ด๋œจ๋ฆฐ ๋„๋ฏธ๋…ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ณต๊ฒฉ์ˆ˜์˜ ์ ์ˆ˜๊ฐ€ ๋จ

๋ฌธ์ œ ํ’€์ด

boolean[][] isFallen : ๊ฐ ๋„๋ฏธ๋…ธ๊ฐ€ ๋„˜์–ด์ ธ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ •๋ณด ๋ฐฐ์—ด
์ด R๋ฒˆ ๋™์•ˆ ๊ฒŒ์ž„ ์ง„ํ–‰
while(R-- > 0)

1. ๊ณต๊ฒฉ ๐Ÿ‘‰ attack(x,y,dir)

while(๋„๋ฏธ๋…ธ ๊ธธ์ด ๋งŒํผ ์ง„ํ–‰)
๋„˜์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋„˜์–ด๋œจ๋ฆฌ๊ณ  ans += 1;
์ด์ „์˜ ๋„๋ฏธ๋…ธ ๋†’์ด์™€ ํ˜„์žฌ ๋„๋ฏธ๋…ธ ๋†’์ด ์ค‘ ๋” ํฐ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ
๊ทธ ํ›„ , -= 1;

์ด๋ฏธ ๋„˜์–ด์ ธ ์žˆ๋‹ค๋ฉด, -= 1; ๋งŒ ํ•ด์ค€๋‹ค!!
๋ฒ”์œ„๊ฐ€ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜, ๋„˜์–ด์ง„ ๋„๋ฏธ๋…ธ์˜ ๊ธธ์ด๊ฐ€ ๋” ์ด์ƒ ๋‹ฟ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€, dir ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰

2. ์ˆ˜๋น„ ๐Ÿ‘‰ depense(x,y)

isFallen[x][y] = false๋กœ ๋ณ€๊ฒฝ !!

3. ์ถœ๋ ฅ

์ด ๋„˜์–ด๋œจ๋ฆฐ ๊ฐœ์ˆ˜ (ans) ์ถœ๋ ฅ ํ›„,

๋„๋ฏธ๋…ธ๊ฐ€ ๋„˜์–ด์ ธ ์žˆ๋‹ค๋ฉด → F,
๋„˜์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด → S ๋ฅผ ์ถœ๋ ฅ

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_BOJ_20165_์ธ๋‚ด์˜_๋„๋ฏธ๋…ธ_์žฅ์ธ_ํ™”์„ {
    static int N, M, R, ans = 0;
    static int[][] map;
    static boolean[][] isFallen;
    static int[] dx = {-1, 0, 0, 1};
    static int[] dy = {0, -1, 1, 0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());

        N = Integer.parseInt(stringTokenizer.nextToken());
        M = Integer.parseInt(stringTokenizer.nextToken());
        R = Integer.parseInt(stringTokenizer.nextToken());

        map = new int[N][M];
        isFallen = new boolean[N][M];

        for (int i = 0; i < N; i++) {
            stringTokenizer = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                map[i][j] = Integer.parseInt(stringTokenizer.nextToken());
            }
        }

        while (R-- > 0) {
            stringTokenizer = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(stringTokenizer.nextToken()) - 1;
            int y = Integer.parseInt(stringTokenizer.nextToken()) - 1;

            int dir = 0;
            switch (stringTokenizer.nextToken()) {
                case "E":
                    dir = 2;
                    break;
                case "W":
                    dir = 1;
                    break;
                case "S":
                    dir = 3;
                    break;
                case "N":
                    dir = 0;
                    break;
            }

            if(!isFallen[x][y]) attack(x, y, dir);

            stringTokenizer = new StringTokenizer(br.readLine());
            x = Integer.parseInt(stringTokenizer.nextToken()) - 1;
            y = Integer.parseInt(stringTokenizer.nextToken()) - 1;

            depense(x, y);
        }

        System.out.println(ans);
        for (boolean[] is : isFallen) {
            for (boolean i : is) {
                if(i) System.out.print("F ");
                else System.out.print("S ");
            }
            System.out.println();
        }
    }

    private static void depense(int x, int y) {
        if(isFallen[x][y]) isFallen[x][y] = false;
    }

    private static void attack(int x, int y, int dir) {
        int height = map[x][y];
        int nx = x;
        int ny = y;

        while (height > 0) {
            if (!isFallen[nx][ny]) {
                height = height < map[nx][ny] ? map[nx][ny] : height;
                height -= 1;
                isFallen[nx][ny] = true;
                ans += 1;
            } else height -= 1;

            nx += dx[dir];
            ny += dy[dir];

            if(nx < 0 || ny < 0 || N <= nx || M <= ny) break;
        }
    }
}
728x90
๋ฐ˜์‘ํ˜•