[코드트리 : 시공의 돌풍]

아빠는 외계연·2023년 9월 23일
0

CodingTest

목록 보기
15/18

url : https://www.codetree.ai/training-field/frequent-problems/problems/heros-of-storm/submissions?page=1&pageSize=20&order=tier
Level : Gold 4
설계 시간 / 총 시간 : 5분/38분

import copy

# 설계 5분 # 총 시간 38분
n, m, t = map(int, input().split())
X = [-1,0,0,1]
Y = [0,1,-1,0]

wind = []
dirty = []
for i in range(n):
    list_ = list(map(int, input().split()))
    for idx, li in enumerate(list_):
        if li == -1:
            wind.append([i, idx])
    dirty.append(list_)

def in_range(y,x):
    if 0<=y<n and 0<=x<m:
        return True
    return False

def dirty_move():
    result = copy.deepcopy(dirty)
    for i in range(n):
        for j in range(m):
            if dirty[i][j] > 0:
                move = dirty[i][j] // 5
                for _ in range(4):
                    dy = Y[_] + i
                    dx = X[_] + j
                    if in_range(dy, dx) and dirty[dy][dx] != -1:
                        result[dy][dx] += move
                        result[i][j] -= move
    return result
# 반시계
def right(sy, sx):
    result = copy.deepcopy(dirty)
    result[sy][sx+1] = 0
    for x in range(sx+2, m):
        result[sy][x] = dirty[sy][x - 1]
    for y in range(sy-1, -1, -1):
        result[y][m-1] = dirty[y+1][m-1]
    for x in range(m-2, -1, -1):
        result[0][x] = dirty[0][x+1]
    for y in range(1, sy):
        result[y][0] = dirty[y-1][0]
    return result

# 시계
def left(sy, sx):
    result = copy.deepcopy(dirty)
    result[sy][sx+1] = 0
    for x in range(sx + 2, m):
        result[sy][x] = dirty[sy][x - 1]
    for y in range(sy + 1, n):
        result[y][m-1] = dirty[y-1][m-1]
    for x in range(m - 2, -1, -1):
        result[n-1][x] = dirty[n-1][x+1]
    for y in range(n - 2, sy, -1):
        result[y][0] = dirty[y + 1][0]
    return result

for i in range(t):
    dirty = dirty_move()
    sy, sx = wind[0]
    dirty = right(sy, sx)
    sy, sx = wind[1]
    dirty = left(sy, sx)

tot_dirt = 2
for i in range(n):
    tot_dirt += sum(dirty[i])

print(tot_dirt)

풀이 방법

먼지 이동 / 시계방향 이동 / 반시계 방향 이동 -> 총 세가지 함수로 분리

주의할점
1. 먼지가 이동하고 나서 주변에 더해지는 건 나중이므로 먼지의 확산의 양에 영향을 미치지 않도록 배열을 따로 복사하는 것이 중요함
2. 돌풍이 이동할 때 범위체크를 정확히 하는 것이 중요

느낀점

  • 그동안은 일단 제출하고 틀린부분을 고치자! 라는 마인드로 풀어와서 문제를 제대로 파악하기도 전에 구현으로 들어갔는데, 이번에는 모든 조건을 꼼꼼히 파악하고 대충 손코딩을 한 뒤에 풀었더니 한번에 통과할 수 있었다.
  • 구현문제는 세세한 조건들이 있는 경우가 많으니 다 파악하는 것이 중요하다
profile
Backend Developer

0개의 댓글