๐Ÿ”‘ CS/์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[๋ฐฑ์ค€ 16235๋ฒˆ] ๋‚˜๋ฌด ์ œํ…Œํฌ (์•…์˜ ์›ํ‰ defaultdict)

๋ณต๋งŒ 2022. 10. 15. 00:01

๊ฑฐ์˜ ๋ชจ๋“  ๋ฌธ์ œ์— defaultdict๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚˜

์ด์œ ๋Š” ์ผ๋‹จ ๋„ˆ๋ฌด ํŽธํ•˜๋‹ค
๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ์— ๋ชจ๋“  case์— ๋Œ€ํ•ด ๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋ผ๋Š” ๋Š๋‚Œ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทผ๋ฐ ์ด์ „์— ์˜ฌ๋ฆฐ ๋ฐฑ์ค€ 14425๋ฒˆ์— ์ด์–ด์„œ ์ด๋ฒˆ์—๋„ ๊ณ„์† ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ ์›์ธ์ด defaultdict์˜€๋‹ค..

 

 

๐ŸŒผ ๋ฌธ์ œ ๋งํฌ

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

 

16235๋ฒˆ: ๋‚˜๋ฌด ์žฌํ…Œํฌ

๋ถ€๋™์‚ฐ ํˆฌ์ž๋กœ ์–ต๋Œ€์˜ ๋ˆ์„ ๋ฒˆ ์ƒ๋„๋Š” ์ตœ๊ทผ N×N ํฌ๊ธฐ์˜ ๋•…์„ ๊ตฌ๋งคํ–ˆ๋‹ค. ์ƒ๋„๋Š” ์†์‰ฌ์šด ๋•… ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋•…์„ 1×1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋†“์•˜๋‹ค. ๊ฐ๊ฐ์˜ ์นธ์€ (r, c)๋กœ ๋‚˜ํƒ€๋‚ด๋ฉฐ, r์€ ๊ฐ€์žฅ ์œ„์—์„œ๋ถ€ํ„ฐ

www.acmicpc.net

  • ํ‹ฐ์–ด: ๊ณจ๋“œ III
  • ๋ถ„๋ฅ˜: ๊ตฌํ˜„, ์ž๋ฃŒ๊ตฌ์กฐ, ์‹œ๋ฎฌ๋ ˆ์ด์…˜


๋ฌธ์ œ ์ž์ฒด๋Š” ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„๋งŒ ํ•˜๋ฉด ๋˜๋Š” ์•„์ฃผ ์‰ฌ์šด ๋ฌธ์ œ์ด๋‹ค.
๊ทธ๋Ÿฌ๋‚˜..

 

 

โ— ์ฝ”๋“œ 1-1. Defaultdict๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„ (์‹คํŒจ)

import sys; input = sys.stdin.readline
from collections import defaultdict, deque

N, M, K = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(N)]
trees = defaultdict(deque)
for _ in range(M):
    x, y, age = map(int, input().split())
    trees[(x-1, y-1)].append(age)

grid = [[5 for _ in range(N)] for _ in range(N)]

def spring():
    num_trees = 0
    tree_age5 = []
    dead_trees = []
    for i, j in trees:
        tmp_ages = deque([])
        while trees[(i, j)]:
            age = trees[(i, j)].popleft()
            if grid[i][j] < age:
                trees[(i, j)].append(age)
                dead_trees.append((i, j, sum([age // 2 for age in trees[(i, j)]])))
                break
            else:
                grid[i][j] -= age
                tmp_ages.append(age+1)
                num_trees += 1
                if (age + 1) % 5 == 0:
                    tree_age5.append((i, j))
        trees[(i, j)] = tmp_ages
    return dead_trees, tree_age5, num_trees

def summer(dead_trees):
    for i, j, sum_ages in dead_trees:
        grid[i][j] += sum_ages

adj = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
def fall(tree_age5, num_trees):
    for i, j in tree_age5:
        for di, dj in adj:
            i_, j_ = i+di, j+dj
            if 0<=i_<N and 0<=j_<N:
                trees[(i_, j_)].appendleft(1)
                num_trees += 1
    return num_trees

def winter():
    for i in range(N):
        for j in range(N):
            grid[i][j] += A[i][j]

for year in range(K):
    dead_trees, tree_age5, num_trees = spring()
    summer(dead_trees)
    num_trees = fall(tree_age5, num_trees)
    winter()

print(num_trees)

 

 

๐Ÿ’ก ์ฝ”๋“œ 1-2. defaultdict๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์€ ๊ตฌํ˜„ (์„ฑ๊ณต)

import sys; input = sys.stdin.readline
from collections import deque

N, M, K = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(N)]
trees = [[deque() for _ in range(N)] for _ in range(N)]
for _ in range(M):
    x, y, age = map(int, input().split())
    trees[x-1][y-1].append(age)

grid = [[5 for _ in range(N)] for _ in range(N)]

def spring():
    num_trees = 0
    tree_age5 = []
    dead_trees = []
    for i in range(N):
        for j in range(N):
            tmp_ages = deque([])
            while trees[i][j]:
                age = trees[i][j].popleft()
                if grid[i][j] < age:
                    trees[i][j].append(age)
                    dead_trees.append((i, j, sum([age // 2 for age in trees[i][j]])))
                    break
                else:
                    grid[i][j] -= age
                    tmp_ages.append(age+1)
                    num_trees += 1
                    if (age + 1) % 5 == 0:
                        tree_age5.append((i, j))
            trees[i][j] = tmp_ages
    return dead_trees, tree_age5, num_trees

def summer(dead_trees):
    for i, j, sum_ages in dead_trees:
        grid[i][j] += sum_ages

adj = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
def fall(tree_age5, num_trees):
    for i, j in tree_age5:
        for di, dj in adj:
            i_, j_ = i+di, j+dj
            if 0<=i_<N and 0<=j_<N:
                trees[i_][j_].appendleft(1)
                num_trees += 1
    return num_trees

def winter():
    for i in range(N):
        for j in range(N):
            grid[i][j] += A[i][j]

for year in range(K):
    dead_trees, tree_age5, num_trees = spring()
    summer(dead_trees)
    num_trees = fall(tree_age5, num_trees)
    winter()

print(num_trees)

 

์ฝ”๋“œ 1-1๊ณผ ์ฝ”๋“œ 1-2๋Š” trees์˜ ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•๋งŒ ๋‹ค๋ฅผ ๋ฟ ๋‚˜๋จธ์ง€ ๋กœ์ง์€ ๋ชจ๋‘ ๊ฐ™๋‹ค.

์ฝ”๋“œ 1-1์˜ ๊ฒฝ์šฐ, trees๋ฅผ defaultdict(deque)๋กœ ๊ตฌํ˜„ํ•ด์„œ, spring()์—์„œ trees์˜ key์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒ€์‚ฌํ•œ๋‹ค.

์ฝ”๋“œ 1-2์˜ ๊ฒฝ์šฐ, trees๋ฅผ [[deque() for _ in range(N)] for _ in range(N)]๋กœ ๊ตฌํ˜„ํ•ด์„œ, spring์—์„œ NxN์˜ ๋ชจ๋“  point์— ๋Œ€ํ•ด ๊ฒ€์‚ฌํ•œ๋‹ค.


๊ฒ€์‚ฌํ•˜๋Š” ์ˆ˜๋Š” ์ฝ”๋“œ 1-2๊ฐ€ ๋” ๋งŽ๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ 1-2๋งŒ ํ†ต๊ณผํ•˜๊ณ , ์ฝ”๋“œ 1-1์€ ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ์‹คํŒจํ–ˆ๋‹ค.
defaultdict์˜ ์‹คํ–‰์‹œ๊ฐ„์ด ๊ฝค๋‚˜ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ์‚ฌ์‹ค..
์•ž์œผ๋ก  ์ ˆ๋Œ€ ์“ฐ์ง€ ๋ง์•„์•ผ์ง€

 


 


์ถ”๊ฐ€๋กœ, spring-summer-fall-winter์„ ๋‹ค ๋‚˜๋ˆ ์„œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋ฒˆ์— ๊ตฌํ˜„ํ•ด์„œ ๋” ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก ์ฝ”๋“œ 2. spring-summer-fall-winter์„ ํ•œ๋ฒˆ์— ๊ตฌํ˜„

import sys; input = sys.stdin.readline
from collections import defaultdict, deque

N, M, K = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(N)]
trees = [[deque() for _ in range(N)] for _ in range(N)]
for _ in range(M):
    x, y, age = map(int, input().split())
    trees[x-1][y-1].append(age)

grid = [[5 for _ in range(N)] for _ in range(N)]
adj = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]

for year in range(K):
    #spring
    new_trees = [[deque() for _ in range(N)] for _ in range(N)]
    num_trees = 0
    for i in range(N):
        for j in range(N):
            while trees[i][j]:
                age = trees[i][j].popleft()
                if grid[i][j] < age:
                    trees[i][j].append(age)
                    #summer
                    for age in trees[i][j]:
                        grid[i][j] += age // 2
                    break
                else:
                    grid[i][j] -= age
                    new_trees[i][j].append(age+1)
                    num_trees += 1
                    #fall
                    if (age+1) % 5 == 0:
                        for di, dj in adj:
                            i_, j_ = i+di, j+dj
                            if 0<=i_<N and 0<=j_<N:
                                new_trees[i_][j_].appendleft(1)
                                num_trees += 1

            #winter
            grid[i][j] += A[i][j]

    trees = new_trees

print(num_trees)



๐ŸŠ ๊ฒฐ๊ณผ

์œ„: ์ฝ”๋“œ 1-2 / ์•„๋ž˜: ์ฝ”๋“œ 2

 

๋ฐ˜์‘ํ˜•