Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python](시뮬) 백준 21610번 : 마법사 상어와 비바라기 본문
728x90
<접근 방법>
- 시뮬레이션 유형이므로 문제에 나와있는 과정 그대로 코드를 구상하도록 한다.
- 끝과 끝이 이어진 격자임을 고려하여 [1]번 과정에서 이동된 구름의 위치i, j를 각각 N으로 나눠준다.
- [2]번 과정에서는 위에서 구한 이동된 구름(new_cloud)의 위치에 비의 양을 +1 해준다.
- [3]번 과정(구름 사라짐)은 따로 구현할 것은 없고, 이후 과정에서 구름의 위치들이 사용되므로 지우지 않음에 유의한다.
- [4]번 과정에서는 각 구름 좌표의 대각선에 물이 들어있는 바구니 수(count)를 세야하므로 ↖,↗,↙,↘ 방향의 물 존재 여부를 카운트하여 각 좌표의 물의 양에 값을 물이 들어있는 바구니 수를 더해준다.
- [5]번 과정에서 구름을 새로 생성해야 하므로 좌표의 값이 2이상(arr[i][j]>=2), 좌표가 new_cloud에 속해있지 않은 좌표들을 cloud라는 새로운 리스트에 저장하고, 그 좌표의 값을 -2 해준다.
- M번의 명령 이후, 모든 좌표의 값을 더해 answer을 구해준다.
N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
directions = {1:(0, -1), 2:(-1, -1), 3:(-1, 0), 4:(-1, 1), 5:(0, 1), 6:(1, 1), 7:(1, 0), 8:(1, -1)}
cloud = [(N-1, 0), (N-1, 1), (N-2, 0), (N-2, 1)]
for _ in range(M):
# [1] 모든 구름이 di방향으로 si칸 이동한다.
di, si = map(int, input().split())
new_cloud = set()
for ci, cj in cloud:
ni = (ci + si*directions[di][0])%N
nj = (cj + si*directions[di][1])%N
new_cloud.add((ni, nj))
# [2] 구름이 있는 칸의 바구니에 저장된 물의 양이 1 증가
for ci, cj in new_cloud:
arr[ci][cj] += 1
# [3] 구름 사라짐
# [4] 물 증가 칸에 물복사버그 마법(대각선 구름 존재 여부 수)
for ci, cj in new_cloud:
count = 0
for di, dj in ((-1, -1), (-1, 1), (1, -1), (1, 1)):
ni = ci + di
nj = cj + dj
if 0<=ni<N and 0<=nj<N and arr[ni][nj]:
count += 1
arr[ci][cj] += count
# [5] 구름 생성
cloud = []
for i in range(N):
for j in range(N):
if arr[i][j] >= 2 and (i, j) not in new_cloud:
cloud.append((i, j))
arr[i][j] -= 2
answer = 0
for i in arr:
answer += sum(i)
print(answer)
이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.
728x90
'삼성 SW 역량 테스트 기출 문제' 카테고리의 다른 글
[Python](시뮬) 백준 14499번 : 주사위 굴리기 (2) | 2024.02.03 |
---|---|
[Python](시뮬) 백준 3190번 : 뱀 (2) | 2024.01.30 |
[Python](시뮬) 백준 21608번 : 상어 초등학교 (2) | 2024.01.28 |
[Python] 백준 20055번 : 컨베이어 벨트 위의 로봇 (0) | 2024.01.28 |
[Python](구현, 조합) 백준 15685번 : 치킨 배달 (0) | 2024.01.18 |