반응형
21610번: 마법사 상어와 비바라기 (acmicpc.net)
<문제 풀이>
- 구현문제로 조건에 따라 순서대로만 한다면 큰 문제없이 풀리는 문제다.
- 구름 생성에서 구름이 소멸한 자리인지 체크하기 위해 in 연산자를 사용했는데, 해당 문제에서는 중복되는 구름의 좌표가 없기 때문에 set을 이용했다. in 연산자는 list에서 시간복잡도는 O(n)이지만 set에서는 O(1)이기 때문에 조금이라도 시간을 줄여보고자 set을 이용했다.
<Code>
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
basket = [list(map(int, input().split())) for _ in range(N)]
move_info = [list(map(int, input().split())) for _ in range(M)]
cloud = [(N-1, 0), (N-1, 1), (N-2, 0), (N-2, 1)]
# 방향
dy = [0, -1, -1, -1, 0, 1, 1, 1]
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
direction = [1, 3, 5, 7] # 대각선 방향 번호
for m in range(M):
# 구름 이동 및 물의 양 1 증가 (조건 1, 2)
move = set()
for a, b in cloud:
y = (a + dy[move_info[m][0]-1] * move_info[m][1]) % N
x = (b + dx[move_info[m][0]-1] * move_info[m][1]) % N
move.add((y, x))
basket[y][x] += 1
# 물복사버그 마법 (조건 4)
for a, b in move:
cnt = 0
for d in direction:
y = a + dy[d]
x = b + dx[d]
if 0 <= y < N and 0 <= x < N and basket[y][x]:
cnt += 1
basket[a][b] += cnt
# 구름 생성 (조건 5)
cloud = []
for i in range(N):
for j in range(N):
if basket[i][j] >= 2 and ((i, j) not in move):
cloud.append((i, j))
basket[i][j] -= 2
answer = 0
for b in basket:
answer += sum(b)
print(answer)
※ 잘못된 점, 개선점 등이 있다면 언제든 댓글로 알려주시면 감사하겠습니다.
반응형
'Alogorithm > BAEKJOON' 카테고리의 다른 글
[BAEKJOON] 23290 마법사 상어와 복제 - Python (0) | 2023.03.30 |
---|---|
[BAEJOON] 21611 마법사 상어와 블리자드 - Python (0) | 2023.03.29 |
[BAEKJOON] 20056 마법사 상어와 파이어볼 (0) | 2023.03.27 |
[BAEKJOON] 21608 상어 초등학교 - Python (2) | 2023.03.24 |
[BAEKJOON] 9084 동전 - Python (0) | 2023.03.22 |