728x90
정말 어려운 것은 아니지만 하나하나 체크하고 신경 쓸게 많은 구현 문제...
정답률 70% 이상인 것으로 보아 어렵진 않다.
문제 예시대로,
1.영양제 이동
2. 이동된 영양제 위치 나무 길이 +1씩
3. 영양제가 있는 나무 기준 대각선을 순회하면서 길이가 1 이상인 개수 곳의 개수만큼 지금 나무 길이 +
4. 길이가 2 이상인 나무 자르고, 자른 나무의 위치가 새롭게 영양제를 주는 곳으로 표시
이 것을 반복하면 된다.
n,m = map(int, input().split())
trees = [list(map(int, input().split())) for _ in range(n)]
moves = [list(map(int, input().split())) for _ in range(m)]
move_dir = {1:(0,1),2:(-1,1),3:(-1,0),4:(-1,-1),5:(0,-1),6:(1,-1),7:(1,0),8:(1,1)}
med = [(n-1,0),(n-1,1),(n-2,0),(n-2,1)]
for d,k in moves:
di, dj = move_dir[d]
check = []
# 영양제 이동
for i,j in med:
if 0<= i+di*k<n:
i += di*k
elif i+di*k<0:
i = i+di*k+n
else:
i = i+di*k-n
if 0<= j+dj*k <n:
j += dj*k
elif j+dj*k<0:
j = j+dj*k+n
else:
j = j+dj*k-n
check.append((i,j))
#영양제가 있는 곳 나무 길이 +1
for ci,cj in check:
trees[ci][cj] += 1
#대각선만큼 개수만큼 현재 나무 길이 +
for ci, cj in check:
count = 0
for ni,nj in [(-1,-1), (1,-1),(-1,1),(1,1)]:
if 0<= ci+ni<n and 0<=cj+nj<n and trees[ci+ni][cj+nj] > 0:
count += 1
trees[ci][cj] += count
#크기 2이상 나무 자르기
med = []
for i in range(n):
for j in range(n):
if (i,j) not in check and trees[i][j] >= 2:
trees[i][j] -= 2
med.append((i,j))
answer = 0
for i in range(n):
for j in range(n):
answer += trees[i][j]
print(answer)
'Python > CoTe' 카테고리의 다른 글
[삼성기출] 테트리스 블럭 안의 합 최대화 하기 - 파이썬 (0) | 2024.04.13 |
---|---|
[삼성기출] 나무 박멸 - 파이썬 (테스트 케이스7 의미) (0) | 2024.04.13 |
[프로그래머스] level3 등굣길 파이썬 (0) | 2024.03.05 |
[프로그래머스] level3 - 야근지수 파이썬 풀이 (0) | 2024.03.05 |
PCCP 모의고사 1회 - 외톨이 알파벳 (파이썬 풀이) (0) | 2024.02.14 |