๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

17143 - ๋‚š์‹œ์™•

๋ฌธ์ œ: boj.kr/17143
๋‚ ์งœ: 8์›” 24์ผ (ํ† )
์„ฑ๊ณต์—ฌ๋ถ€: X

 

 

๊ฐ€๊นŒ์šด ์ƒ์–ด๋ฅผ ์žก๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์–ด๊ฐ€ ์›€์ง์ธ๋‹ค.

์ƒ์–ด๊ฐ€ ์›€์ง์ธ ํ›„ ๊ฐ™์€ ์ž๋ฆฌ์— ์ƒ์–ด๊ฐ€ ์žˆ์œผ๋ฉด ํฌ๊ธฐ ๋น„๊ต ํ›„ ๋‘˜ ์ค‘ ํ•˜๋‚˜ ์ฃฝ์Œ

 

๊ตฌํ˜„ํ•ด์•ผ ๋  ๋กœ์ง

  1. ๋‚š์‹œ์™• move
  2. ๋‚š์‹œ์™•์˜ ์ƒ์–ด ์žก๊ธฐ
  3. ์ƒ์–ด move
  4. ์ƒ์–ด๋ผ๋ฆฌ ์žก์–ด ๋จน๊ธฐ

โ €

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์–ด๋ ค์šด ๊ฒƒ์ด ์ƒ์–ด์˜ ์›€์ง์ž„์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ƒ์–ด์˜ ์›€์ง์ž„์—์„œ ์ƒ๊ฐํ•ด๋ณผ ๊ฒƒ์ด ์žˆ๋‹ค. ์ƒ์–ด๋Š” speed๋ฅผ ๊ฐ€์ง€๋ฉฐ 1์ดˆ์— speed๋งŒํผ ์›€์ง์ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›€์ง์ด๋ฉด์„œ ๋ฒฝ์„ ๋งŒ๋‚˜๋ฉด ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๊ณ  ์ง„ํ–‰ํ•œ๋‹ค. ์ด๋Ÿฐ ์›€์ง์ž„์€ 0๋ถ€ํ„ฐ speed๊นŒ์ง€ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ํ•œ ๋ฒˆ์— ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ฐ•์˜์—์„œ ์‚ฌ์šฉํ•œ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๋ฉด ์‹œ๊ฐ„์„ ์ข€ ๋” ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„์„ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

๊ฐ•์˜๋ฅผ ๋ณด๊ธฐ ์ „, ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ•์€ ๋งต์˜ c ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ด ๋ฐฉ๋ฒ•์€ ์•ˆ๋œ๋‹ค. ์ด ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด๋ฉด ์™œ ์ด ๋ฐฉ๋ฒ•์ด ์•ˆ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ํฌ๊ธฐ์˜ map์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  3์นธ์„ ์ด๋™ํ•ด๋ณด์ž. ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๋ฉด 3 % 5 ์ด๋ฏ€๋กœ 3์ด๋‹ค.

p
0 1 2 3 4

  p
0 1 2 3 4 - 1์นธ

    p
0 1 2 3 4 - 2์นธ

      p
0 1 2 3 4 - 3์นธ

 

์ •ํ™•ํ•˜๊ฒŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์ด๋ฒˆ์—” ๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž.

 

10์นธ์„ ์›€์ง์—ฌ๋ณด์ž. 10 % 5 = 0์ด๋‹ค.

p
0 1 2 3 4

  p
0 1 2 3 4 - 1์นธ

    p
0 1 2 3 4 - 2์นธ

      p
0 1 2 3 4 - 3์นธ

        p
0 1 2 3 4 - 4์นธ

      p
0 1 2 3 4 - 5์นธ

    p
0 1 2 3 4 - 6์นธ

  p
0 1 2 3 4 - 7์นธ

p
0 1 2 3 4 - 8์นธ

  p
0 1 2 3 4 - 9์นธ

    p
0 1 2 3 4 - 10์นธ

 

์˜ˆ์ƒํ•˜๋Š” ์œ„์น˜์™€ ๋‹ค๋ฅด๋‹ค. ์—ฌ๊ธฐ์„œ ์ข€ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด ์™œ ์•ˆ๋˜๋Š”์ง€ ์ง์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ c๊ฐ€ 5๋ผ๋„ ์ด๋™ํ•˜๋Š” ์นธ ์ˆ˜๋Š” 4์นธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ 5๋กœ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ•˜๋ฉด 5์นธ์„ ์ด๋™ํ•œ ๊ฒƒ์ด ๋˜์–ด๋ฒ„๋ ค ์˜ˆ์ƒํ•˜๋Š” ๊ฐ’๊ณผ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ 4์นธ์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ•˜๋ฉด ๋œ๋‹ค. 10 % 4 = 2์ด๋‹ค. ์˜ˆ์ƒํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์œ„์น˜๊ฐ€ ๋‚˜์™”๋‹ค.

 

๊ทธ๋Ÿผ ๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋กœ ์™•๋ณต์„ ํ•˜์ง€ ์•Š๊ณ  ์ค‘๊ฐ„์— ๋ฉˆ์ถ”๋Š” ๊ฒฝ์šฐ ์ค‘ 7์นธ์„ ์˜ˆ์‹œ๋กœ ์•Œ์•„๋ณด์ž. 7 % 4 = 3์ด๋‹ค.

p
0 1 2 3 4

  p
0 1 2 3 4 - 1์นธ

    p
0 1 2 3 4 - 2์นธ

      p
0 1 2 3 4 - 3์นธ

        p
0 1 2 3 4 - 4์นธ

      p
0 1 2 3 4 - 5์นธ

    p
0 1 2 3 4 - 6์นธ

  p
0 1 2 3 4 - 7์นธ

 

์˜ˆ์ƒํ•˜๋Š” ์œ„์น˜์™€ ๋‹ค๋ฅด๋‹ค. ํ•˜์ง€๋งŒ 4์—์„œ 3์„ ๋นผ๋ฉด ์˜ˆ์ƒํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ 4์—์„œ 3์„ ๋นผ๋Š” ๊ธฐ์ค€์„ ์ •ํ•  ๊ฒƒ์ธ๊ฐ€?์— ๋Œ€ํ•ด์„œ ๋‹ต์„ ๋‚ด๋ฆฌ์ง€ ๋ชปํ–ˆ๋‹ค....

 

๊ทธ๋ž˜์„œ ๊ฐ•์˜๋ฅผ ๋ดค๋Š”๋ฐ ์–ด๋А์ •๋„ ๋น„์Šทํ•œ ๋ฐฉ์‹์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐ•์˜๋Š” map์˜ c ํฌ๊ธฐ ์ฆ‰, ํŽธ๋„๊ฐ€ ์•„๋‹ˆ๋ผ ์™•๋ณต์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ–ˆ๋‹ค. ์ด ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ฉด '๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๋ฉด' ์ด๋ผ๋Š” ๊ธฐ์ค€์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ 3์นธ, 10์นธ์„ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์™•๋ณต์— 8์นธ์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ 8๋กœ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ•˜๋ฉด ๊ฐ๊ฐ 3์นธ, 2์นธ์ด ๋‚˜์˜จ๋‹ค. 10์นธ์ด๋‚˜ 3์นธ์ด๋‚˜ ์›๋ž˜์˜ ๋ฐฉํ–ฅ๋Œ€๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ ์ด๋™ํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ๋งˆ์ง€๋ง‰ ์œ„์น˜์—์„œ ๋ฐฉํ–ฅ์ด ์ „ํ™˜๋œ ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๋Š” ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋ฐ”๋กœ ์œ„์˜ 7์นธ๋„ ๊ทธ๋ ‡๊ณ  13์นธ๋„ ๊ทธ๋ ‡๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋งŒ ๋ฐ˜๋Œ€ํŽธ์—์„œ ๋‹ค์‹œ ๋‚˜๋จธ์ง€๋ฅผ ์ด๋™ํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

 

์ด๊ฒƒ๋งŒ ์•Œ๋ฉด !!!

๋‚˜๋จธ์ง„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฝ”๋“œ

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

public class Main {

    static int[] dy = {-1, 1, 0, 0};
    static int[] dx = {0, 0, 1, -1};

    static int r, c, m;
    static int[][] map;
    static int[][] temp;
    static int ret = 0;

    static class shark {
        int y, x;
        int size;
        int dir;
        int speed;
        boolean death;

        public shark(int y, int x, int s, int d, int z) {
            this.y = y;
            this.x = x;
            this.speed = s;
            this.dir = d;
            this.size = z;
            this.death = false;
        }

        public shark() {}
    }

    static ArrayList<shark> sharks = new ArrayList<>();

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

        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        map = new int[r][c];
        sharks.add(new shark());
        for (int i = 1; i <= m; i++) {
            st = new StringTokenizer(br.readLine());
            int y = Integer.parseInt(st.nextToken())-1;
            int x = Integer.parseInt(st.nextToken())-1;
            int s = Integer.parseInt(st.nextToken());
            int d = Integer.parseInt(st.nextToken())-1;
            int size = Integer.parseInt(st.nextToken());
            sharks.add(new shark(y, x, s, d, size));

            if (d <= 1) sharks.get(i).speed %= (r - 1);
            else sharks.get(i).speed %= (c - 1);
            map[y][x] = i;
        }

        for (int t = 0; t < c; t++) {

            for (int y = 0; y < r; y++) {
                if (map[y][t] > 0) {
                    sharks.get(map[y][t]).death = true;
                    ret += sharks.get(map[y][t]).size;
                    map[y][t] = 0;
                    break;
                }
            }

            temp = new int[r][c];
            for (int idx = 1; idx <= m; idx++) {
                if (sharks.get(idx).death) continue;

                int y = sharks.get(idx).y;
                int x = sharks.get(idx).x;
                int s = sharks.get(idx).speed;
                int d = sharks.get(idx).dir;
                int ny, nx;

                boolean flag = false;
                while (true) {
                    ny = y + s * dy[d];
                    nx = x + s * dx[d];

                    if (ny < r && nx < c && ny >= 0 && nx >= 0) break;
                    if (d <= 1) {
                        if (ny < 0) {
                            s -= y;
                            y = 0;
                        } else {
                            s -= r - 1 - y;
                            y = r-1;
                        }
                    } else {
                        if (nx < 0) {
                            s -= x;
                            x = 0;
                        } else {
                            s -= c-1-x;
                            x = c-1;
                        }
                    }

                    d ^= 1;
                }

                if (temp[ny][nx] > 0) {
                    if (sharks.get(temp[ny][nx]).size > sharks.get(idx).size)
                        sharks.get(idx).death = true;
                    else {
                        sharks.get(temp[ny][nx]).death = true;
                        temp[ny][nx] = idx;
                    }
                } else temp[ny][nx] = idx;

                sharks.get(idx).y = ny;
                sharks.get(idx).x = nx;
                sharks.get(idx).dir = d;
            }

            for (int i = 0; i < r; i++) map[i] = temp[i].clone();
        }

        System.out.println(ret);
    }
}