복기
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)
'Dev > Algorithm' 카테고리의 다른 글
[코드트리] 메이즈러너 - 파이썬 (0) | 2025.04.04 |
---|---|
SW 역량 테스트 전, 삼성 빈출 코드 유형 정리 (0) | 2025.04.03 |
[프로그래머스] 타겟 넘버 (0) | 2025.03.21 |
[프로그래머스] 전력망을 둘로 나누기 (0) | 2025.03.21 |
[프로그래머스] 피로도 - 파이썬 (0) | 2025.03.20 |
댓글