본문 바로가기
Dev/Algorithm

[코드트리] 나무 타이쿤 - 파이썬

by jusep 2025. 4. 1.


복기

1. 여차저차 구현을 하긴 했는데 일부 조건이 틀려서 못 풀었다. 정답률 70% 수준의 문제는 절대 아닌데..? 양치기로 많이 풀어보자

2. 처음에 이렇게 했었는데 음수가 생길 수도 있었네..

(x + dx[d-1] * p) % n

n*p를 더해서 음수 좌표를 방지

(x + dxs[d] * p + n * p) % n

솔루션

n, m = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
ls = []
for i in range(m):
    d, p = map(int, input().split())
    ls.append([d-1, p])  # 방향은 0부터 시작하도록 조정

# 방향: → ↗ ↑ ↖ ← ↙ ↓ ↘
dx = [0, -1, -1, -1, 0, 1, 1, 1]
dy = [1, 1, 0, -1, -1, -1, 0, 1]

# 초기 영양제 위치 (좌측 하단 2x2)
nutrient = [[False] * n for _ in range(n)]
for i in range(n-2, n):
    for j in range(2):
        nutrient[i][j] = True

# 메인 루프
for i in range(m):
    d, p = ls[i]
    
    # 1. 영양제 이동
    new_nutrient = [[False] * n for _ in range(n)]
    for x in range(n):
        for y in range(n):
            if nutrient[x][y]:
                nx = (x + dx[d] * p + n * p) % n  # 음수 방지
                ny = (y + dy[d] * p + n * p) % n
                arr[nx][ny] += 1  # 나무 높이 +1
                new_nutrient[nx][ny] = True
    
    # 2. 대각선 성장
    for x in range(n):
        for y in range(n):
            if new_nutrient[x][y]:
                count = 0
                # 대각선
                for dx2, dy2 in [(-1, 1), (-1, -1), (1, -1), (1, 1)]:
                    nx = x + dx2
                    ny = y + dy2
                    if 0 <= nx < n and 0 <= ny < n and arr[nx][ny] >= 1:
                        count += 1
                arr[x][y] += count
    
    # 3. 나무 베기 및 새 영양제
    nutrient = [[False] * n for _ in range(n)]
    for x in range(n):
        for y in range(n):
            if new_nutrient[x][y]:
                continue  # 기존 영양제 위치는 유지하지 않음
            if arr[x][y] >= 2:
                arr[x][y] -= 2
                nutrient[x][y] = True

# 최종 합계
total_height = sum(sum(row) for row in arr)
print(total_height)

댓글