
https://www.acmicpc.net/problem/31418
문제
정해진 스펀지 내에서 일정 시간이 흘렀을 때 바이러스들의 분포의 수를 구하는 문제이다. 바이러스들은 1초에 대각선, 상하좌우 중 한 방향으로 한 칸 이동하거나 움직이지 않을 수 있다.
풀이
바이러스가 어디에 있을 수 있냐를 구하는 문제이다. 바이러스는 좌우로는 최대 $ T $ 만큼 이동할 수 있고, 상하로도 최대 $ T $ 만큼 이동할 수 있다. 대각선도 마찬가지이니 바이러스 위치는 $ (2 \times T + 1) \times (2 \times T + 1) $ 개의 가능성을 가진다.
그런데 바이러스는 스펀지에서 벗어나진 못하므로 바이러스가 이동하다가 좌우측, 상하측으로 스펀지에 막힐 가능성을 생각해야 한다. 만약 바이러스가 이동할 수 있는 최대 좌측 좌표가 1 보다 작다면 스펀지 밖이기 때문에 수정해주어야 하고, 우측으로는 가로 길이 $ W $ 보다 길다면 수정해주어야 한다. 아래로도 1 보다 작다면, 위로도 $ H $ 보다 작다면 수정해주어야 한다.
좌측이랑 하방 좌표는 $ \max $ 을 이용하면 되겠고, 우측이랑 상방은 $ \min $ 을 사용하면 되겠다.
각 좌표에 있는 바이러스가 있을 수 있는 모든 자리의 수를 구했다면 모두 곱하면 된다. 998244353 으로 나누어 나머지를 구하라 했으니 주의해야 한다.
코드
width, height, virus_num, time = map(int, input().split())
ans = 1
for _ in range(virus_num):
x, y = map(int, input().split())
ans = ans * (min(width, x+time) - max(1, x-time) + 1) * (min(height, y+time) - max(1, y-time) + 1) % 998244353
print(ans)
'Online Judge > Baekjoon' 카테고리의 다른 글
[Baekjoon 23886] 알프수 1 | Python (0) | 2024.11.09 |
---|---|
[Baekjoon 20436] ZOAC 3 | Python (0) | 2024.10.03 |
[Baekjoon 9414] 프로그래밍 대회 전용 부지 | Python (0) | 2024.09.19 |
[Baekjoon 14381] 숫자세는 양 (Small) | Python (0) | 2024.09.19 |
[Baekjoon 10816] 숫자 카드 2 | Python (0) | 2024.09.03 |

https://www.acmicpc.net/problem/31418
문제
정해진 스펀지 내에서 일정 시간이 흘렀을 때 바이러스들의 분포의 수를 구하는 문제이다. 바이러스들은 1초에 대각선, 상하좌우 중 한 방향으로 한 칸 이동하거나 움직이지 않을 수 있다.
풀이
바이러스가 어디에 있을 수 있냐를 구하는 문제이다. 바이러스는 좌우로는 최대 $ T $ 만큼 이동할 수 있고, 상하로도 최대 $ T $ 만큼 이동할 수 있다. 대각선도 마찬가지이니 바이러스 위치는 $ (2 \times T + 1) \times (2 \times T + 1) $ 개의 가능성을 가진다.
그런데 바이러스는 스펀지에서 벗어나진 못하므로 바이러스가 이동하다가 좌우측, 상하측으로 스펀지에 막힐 가능성을 생각해야 한다. 만약 바이러스가 이동할 수 있는 최대 좌측 좌표가 1 보다 작다면 스펀지 밖이기 때문에 수정해주어야 하고, 우측으로는 가로 길이 $ W $ 보다 길다면 수정해주어야 한다. 아래로도 1 보다 작다면, 위로도 $ H $ 보다 작다면 수정해주어야 한다.
좌측이랑 하방 좌표는 $ \max $ 을 이용하면 되겠고, 우측이랑 상방은 $ \min $ 을 사용하면 되겠다.
각 좌표에 있는 바이러스가 있을 수 있는 모든 자리의 수를 구했다면 모두 곱하면 된다. 998244353 으로 나누어 나머지를 구하라 했으니 주의해야 한다.
코드
width, height, virus_num, time = map(int, input().split())
ans = 1
for _ in range(virus_num):
x, y = map(int, input().split())
ans = ans * (min(width, x+time) - max(1, x-time) + 1) * (min(height, y+time) - max(1, y-time) + 1) % 998244353
print(ans)
'Online Judge > Baekjoon' 카테고리의 다른 글
[Baekjoon 23886] 알프수 1 | Python (0) | 2024.11.09 |
---|---|
[Baekjoon 20436] ZOAC 3 | Python (0) | 2024.10.03 |
[Baekjoon 9414] 프로그래밍 대회 전용 부지 | Python (0) | 2024.09.19 |
[Baekjoon 14381] 숫자세는 양 (Small) | Python (0) | 2024.09.19 |
[Baekjoon 10816] 숫자 카드 2 | Python (0) | 2024.09.03 |