[BOJ][๐ŸŸก1][๋ฐฑ์ค€#17143] ๋‚š์‹œ์™•

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #17143


๋ฌธ์ œ

๋‚š์‹œ์™•์ด ์ƒ์–ด ๋‚š์‹œ๋ฅผ ํ•˜๋Š” ๊ณณ์€ ํฌ๊ธฐ๊ฐ€ Rร—C์ธ ๊ฒฉ์žํŒ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฒฉ์žํŒ์˜ ๊ฐ ์นธ์€ (r, c)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. r์€ ํ–‰, c๋Š” ์—ด์ด๊ณ , (R, C)๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— ์žˆ๋Š” ์นธ์ด๋‹ค.ย ์นธ์—๋Š” ์ƒ์–ด๊ฐ€ ์ตœ๋Œ€ ํ•œ ๋งˆ๋ฆฌ ๋“ค์–ด์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ƒ์–ด๋Š” ํฌ๊ธฐ์™€ ์†๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋‚š์‹œ์™•์€ ์ฒ˜์Œ์— 1๋ฒˆ ์—ด์˜ ํ•œ ์นธ ์™ผ์ชฝ์— ์žˆ๋‹ค. ๋‹ค์Œ์€ 1์ดˆ ๋™์•ˆ ์ผ์–ด๋‚˜๋Š” ์ผ์ด๋ฉฐ, ์•„๋ž˜ ์ ํžŒ ์ˆœ์„œ๋Œ€๋กœ ์ผ์–ด๋‚œ๋‹ค. ๋‚š์‹œ์™•์€ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์—ด์˜ ์˜ค๋ฅธ์ชฝ ์นธ์— ์ด๋™ํ•˜๋ฉดย ์ด๋™์„ ๋ฉˆ์ถ˜๋‹ค.

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

์ƒ์–ด๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์†๋„๋กœ ์ด๋™ํ•˜๊ณ , ์†๋„์˜ ๋‹จ์œ„๋Š” ์นธ/์ดˆ์ด๋‹ค. ์ƒ์–ด๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์ด ๊ฒฉ์žํŒ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐฉํ–ฅ์„ ๋ฐ˜๋Œ€๋กœ ๋ฐ”๊ฟ”์„œ ์†๋ ฅ์„ ์œ ์ง€ํ•œ์ฑ„๋กœ ์ด๋™ํ•œ๋‹ค. ์™ผ์ชฝ ๊ทธ๋ฆผ์˜ ์ƒํƒœ์—์„œ 1์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด ์˜ค๋ฅธ์ชฝ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์ƒ์–ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์ด ์†๋„์˜ ๋ฐฉํ–ฅ, ์™ผ์ชฝ ์•„๋ž˜์— ์ ํžŒ ์ •์ˆ˜๋Š” ์†๋ ฅ์ด๋‹ค.ย ์™ผ์ชฝ ์œ„์— ์ƒ์–ด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ž๋ฅผ ์ ์—ˆ๋‹ค.

์ƒ์–ด๊ฐ€ ์ด๋™์„ ๋งˆ์นœ ํ›„์— ํ•œ ์นธ์— ์ƒ์–ด๊ฐ€ ๋‘ ๋งˆ๋ฆฌ ์ด์ƒ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ๋Š” ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ํฐ ์ƒ์–ด๊ฐ€ ๋‚˜๋จธ์ง€ ์ƒ์–ด๋ฅผ ๋ชจ๋‘ ์žก์•„๋จน๋Š”๋‹ค. ๋‚š์‹œ์™•์ด ์ƒ์–ด ๋‚š์‹œ๋ฅผ ํ•˜๋Š” ๊ฒฉ์žํŒ์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‚š์‹œ์™•์ด ์žก์€ย ์ƒ์–ด ํฌ๊ธฐ์˜ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ฒฉ์žํŒ์˜ ํฌ๊ธฐ R, C์™€ ์ƒ์–ด์˜ ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. (2ย โ‰ค R, C โ‰ค 100, 0 โ‰ค M โ‰คย Rร—C) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ์ƒ์–ด์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ƒ์–ด์˜ ์ •๋ณด๋Š” ๋‹ค์„ฏย ์ •์ˆ˜ r, c, s, d, z (1 โ‰ค r โ‰ค R, 1 โ‰ค c โ‰ค C, 0 โ‰ค s โ‰ค 1000, 1 โ‰ค d โ‰ค 4, 1 โ‰ค z โ‰ค 10000)ย ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. (r, c)๋Š” ์ƒ์–ด์˜ ์œ„์น˜, s๋Š” ์†๋ ฅ, d๋Š” ์ด๋™ ๋ฐฉํ–ฅ, z๋Š” ํฌ๊ธฐ์ด๋‹ค. d๊ฐ€ 1์ธ ๊ฒฝ์šฐ๋Š” ์œ„, 2์ธ ๊ฒฝ์šฐ๋Š” ์•„๋ž˜, 3์ธ ๊ฒฝ์šฐ๋Š” ์˜ค๋ฅธ์ชฝ, 4์ธ ๊ฒฝ์šฐ๋Š” ์™ผ์ชฝ์„ ์˜๋ฏธํ•œ๋‹ค. ๋‘ ์ƒ์–ด๊ฐ€ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ๋Š” ์—†๊ณ , ํ•˜๋‚˜์˜ ์นธ์— ๋‘˜ ์ด์ƒ์˜ ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.


์ถœ๋ ฅ

๋‚š์‹œ์™•์ด ์žก์€ ์ƒ์–ด ํฌ๊ธฐ์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

4 6 8
4 1 3 3 8
1 3 5 2 9
2 4 8 4 1
4 5 0 1 4
3 3 1 2 7
1 5 8 4 3
3 6 2 1 2
2 2 2 3 5


์ถœ๋ ฅ

22


์˜ˆ์ œ 2

์ž…๋ ฅ

100 100 0


์ถœ๋ ฅ

0


์˜ˆ์ œ 3

์ž…๋ ฅ

4 5 4
4 1 3 3 8
1 3 5 2 9
2 4 8 4 1
4 5 0 1 4


์ถœ๋ ฅ

22


์˜ˆ์ œ 4

์ž…๋ ฅ

2 2 4
1 1 1 1 1
2 2 2 2 2
1 2 1 2 3
2 1 2 1 4


์ถœ๋ ฅ

4


My Sol

import sys
input = sys.stdin.readline

def main():
    def place_sharks():
        sharks = {}
        for m in range(M):
            i, j, s, d, z = map(int, input().split())
            mat[i-1][j-1].append((z, s, d, m))
            sharks[m] = (i-1, j-1, z, s, d)
        return sharks

    def hunt_shark():
        size = 0
        for i in range(I):
            if not mat[i][kj]: continue
            z, s, d, m = mat[i][kj].pop()
            sharks[m] = ()
            sharks_nums.remove(m)
            size = z
            break
        return size

    def move_sharks():
        new_sharks = {}
        for m in sharks_nums:
            i, j, z, s, d = sharks[m]
            mat[i][j].pop()
            ni, nj, nd = move_shark(i, j, s, d)
            new_sharks[m] = (ni, nj, z, s, nd)
        return new_sharks

    def move_shark(i, j, s, d):
        if not s:
            return i, j, d

        di, dj = DD[d]
        if di:
            return move_vertical(i, j, s, d)
        else:
            return move_horizontal(i, j, s, d)

    def move_vertical(i, j, s, d):
        di, dj = DD[d]
        s = s%((I-1)*2)
        while True:
            si = i+di*s
            if 0<=si<I: return si, j, d
            move_i = I-1-i if di > 0 else i
            i = i+move_i if di > 0 else i-move_i
            s -= move_i
            di *= -1
            d = RD[d]

    def move_horizontal(i, j, s, d):
        di, dj = DD[d]
        s = s%((J-1)*2)
        while True:
            sj = j+dj*s
            if 0<=sj<J: return i, sj, d
            move_j = J-1-j if dj > 0 else j
            j = j+move_j if dj > 0 else j-move_j
            s -= move_j
            dj *= -1
            d = RD[d]

    def fill_sharks():
        for m in sharks_nums:
            i, j, z, s, d = sharks[m]
            if not mat[i][j]:
                mat[i][j].append((z, s, d, m))

            else:
                if mat[i][j][0][0] > z:
                    remove_sharks_set.add(m)
                else:
                    rm = mat[i][j][0][3]
                    remove_sharks_set.add(rm)
                    mat[i][j].pop()
                    mat[i][j].append((z, s, d, m))

    def remove_sharks():
        for rm in remove_sharks_set:
            remove_shark(rm)
        remove_sharks_set.clear()

    def remove_shark(m):
        sharks_nums.remove(m)
        sharks[m] = ()


    I, J, M = map(int, input().split())
    mat = [[[] for _ in range(J)] for _ in range(I)]
    sharks = place_sharks()
    sharks_nums = set(range(M))
    remove_sharks_set = set()

    RD = {1:2, 2:1, 3:4, 4:3}
    DD = {1:(-1,0), 2:(1,0), 3:(0,1), 4:(0,-1)}

    ret = 0
    for kj in range(J):
        ret += hunt_shark()
        sharks = move_sharks()
        fill_sharks()
        remove_sharks()
    return ret

print(main())

๊ฝค๋‚˜ ๋ณต์žกํ–ˆ๋˜ ๊ตฌํ˜„ ๋ฌธ์ œ์˜€๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ๊ณ„๋ณ„๋กœ ์ž˜ ๋ชจ๋“ˆํ™”ํ•ด์„œ ํŒŒํ›ผํ•œ๋‹ค๋ฉด ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ’€์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  1. ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. ์ƒ์–ด๋“ค์˜ ์ดˆ๊ธฐ ์œ„์น˜๋ฅผ ๋ฐ›๋Š” place_sharks ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด mat 2์ฐจ์› ๋ฐฐ์—ด์— ์ƒ์–ด ์ •๋ณด๋ฅผ ๋ฐฐ์น˜ํ•จ์€ ๋ฌผ๋ก , ์ƒ์–ด ๋ฒˆํ˜ธ๋“ค์„ ์ง€์ •ํ•œ sharks set์„ ๋‘์—ˆ๋‹ค. ์ด sharks set์˜ ์ •๋ณด๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ํ›„์— ๋‚จ์€ shark๋“ค์˜ ์ด๋™์„ ๋งค๋ฒˆ ํ•ด์ฃผ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
  2. ๋‚š์‹œ๊พผ์ด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ดˆ๋‹น ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ for๋ฌธ์„์˜ค ์ž‘์„ฑํ•˜์˜€๋‹ค. ๊ฐ ์—ด๋งˆ๋‹ค ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์ƒ์–ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ทธ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ hunt_shark ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์˜€๊ณ , ์ด๋ฅผ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ’์ธ ret์— ๋”ํ•ด์ฃผ์—ˆ๋‹ค.
  3. ์ดํ›„ ๊ฐ ์ƒ์–ด๋งˆ๋‹ค ์›€์ง์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜ move_sharks ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์˜€๋Š”๋ฐ, ์ƒ์–ด๋งˆ๋‹ค ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๊ณ  ์ •๋ณด๋ฅผ ์žฌ์กฐ์ •ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์–ด๋‹น ์ด๋™์„ ํ•˜๋Š” move_shark ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์˜€๊ณ , ์ด๋Š” ๋‹ค์‹œ ์ด๋™ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ move_vertical๊ณผ move_horizontal๋กœ ๋‚˜๋ˆ„์–ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธํ•˜๋ฉฐ ์ตœ์ข… ์ด๋™ ์ขŒํ‘œ๋ฅผ ํ™•์ •ํ•œ๋‹ค.
  4. ์ƒ์–ด๋“ค์˜ ๊ฐ ์ด๋™ ํ›„ ์ •๋ณด๋“ค์„ ๊ณ„์‚ฐํ•œ ๋’ค fill_sharks ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋น„์›Œ์ง„ mat 2์ฐจ์› ๋ฐฐ์—ด์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ƒ์–ด๊ฐ€ ๊ฒน์นœ๋‹ค๋ฉด ํฌ๊ธฐ๊ฐ€ ํฐ ์ƒ์–ด๋งŒ ๋‚จ๊ฒจ์ฃผ์–ด์•ผ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ set์„ ์ˆœํšŒํ•˜๋Š” ๊ณผ์ •์—์„œ set์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ์•ˆ ๋๊ธฐ ๋•Œ๋ฌธ์— main์— remove_sharks_set set์„ ๋‘์–ด์„œ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ์ƒ์–ด ๋ฒˆํ˜ธ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  5. ์ดํ›„ remove_sharks ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ œ๊ฑฐ ๋Œ€์ƒ ์ƒ์–ด์˜ ์ •๋ณด๋ฅผ sharks์—์„œ ์ง€์› ๋‹ค.
  6. ๋ชจ๋“  ๊ณผ์ •์—์„œ sharks dictionary์™€ sharks_nums set์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ ์ƒ์–ด์˜ ๊ฐ ์ •๋ณด๋งˆ๋‹ค ๋ฒˆํ˜ธ๋ฅผ ๋งค๊ฒจ ์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ ์‚ฌ๋ƒฅ๋‹นํ•œ ์ƒ์–ด๋Š” ์ •๋ณด๋ฅผ ์ง€์›Œ์ฃผ๋Š” ๋“ฑ์˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค. ์ด ๊ณผ์ •์—์„œ ํŽธ์˜๋ฅผ ์œ„ํ•ด index ์ฐธ์กฐ dictionary์™€ set์„ ๋”ฐ๋กœ ๋‘” ๊ฒƒ์ด๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ