https://www.acmicpc.net/problem/31418
(이 문제는 SUAPC 2024 Winter에 출제된 문제다. 참고로 나는 대회에 나가서 해당 문제를 풀었다. 오픈 콘테스트가 종료되고 문제가 공개되었길래 코드를 한 번 제출해본 뒤 미리 작성해둔 글을 올린다. 느낀점은 대회 당시 내가 했던 생각들을 옮겼다.)
코드
#include <iostream>
#include <cmath>
using namespace std;
#define MOD 998244353
typedef long long ll;
ll w, h, k, t, x, y, move, width, height, lwidth, rwidth, up, down;
ll result = 1;
int main()
{
cin >> w >> h >> k >> t;
for (int i = 0; i < k; i++)
{
cin >> x >> y;
width = 1, height = 1;
lwidth = (x - t > 0) ? x-t : 1;
rwidth = min(w, x + t);
width = rwidth - lwidth + 1;
up = (y - t > 0) ? y - t : 1;
down = min(h, y + t);
height = down - up + 1;
result *= (width * height) % MOD;
result %= MOD;
}
cout << result;
return 0;
}
설명
w, h, k, t를 입력받고 k개의 바이러스의 위치 정보를 반복문을 통해 입력받는다. 반복문에서는 바이러스가 이동할 수 있는 위치 좌표를 왼쪽, 오른쪽, 위쪽, 아래쪽 각각 구해준다. 바이러스가 이동할 수 있는 가로 길이는 오른쪽 좌표 - 왼쪽 좌표 +1 이고, 세로 길이는 아래 좌표값 - 위 좌표값 + 1이 된다.
최종 결과를 저장할 result에 계속 가로*세로% MOD 값을 곱해주고 안전하게 한 번 더 result에 대해 MOD를 나눠준다. 반복문이 끝나고 result를 출력하면 된다.
(대회 당시) 느낀 점
문제를 읽어보니 바이러스가 이동 가능한 경우의 수는 곧 사각형의 크기다. 그리고 바이러스 간 이동은 독립이니 각각 바이러스 별로 사각형을 구해서 이 사각형의 넓이를 곱해나가면 되겠다는 것까지는 바로 파악했다. 쉬운 문제라고 판단하고 급하게 풀려다보니 실수로 사각형 세로 길이를 잘못 구했다. 그래서 한 번 틀리고 바로 코드를 고쳐서 내니 통과했던 문제다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C++] 9470 Strahler 순서 (0) | 2024.02.25 |
---|---|
[백준/C++] 31423 신촌 통폐합 계획 (0) | 2024.02.18 |
[백준/C++] 10026 적록색약 (2) | 2024.02.14 |
[백준/C++] 29160 나의 FIFA 팀 가치는? (0) | 2024.02.13 |
[백준/C++] 2485 가로수 (0) | 2024.02.09 |