PS (C, C++)

[백준/C++] 31418 스펀지

최연재 2024. 2. 18. 22:10

https://www.acmicpc.net/problem/31418

 

31418번: 스펀지

첫 번째 줄에 스펀지의 가로 길이 $W$와 세로 길이 $H$, 바이러스의 수 $K$, raa가 바이러스를 관찰할 시간 $T$가 공백으로 구분되어 주어진다. $(1 \leq W, H, K \leq 10^6;$ $0 \leq T \leq 10^6)$ 이어서 $K$줄에

www.acmicpc.net

(이 문제는 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