※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2564번 문제인 경비원이다.
문제는 아래 링크를 확인하자.

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

 

2564번: 경비원

첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄

www.acmicpc.net

기준점과 기준 방향을 하나 잡고(글쓴이는 주어지는 블록의 좌상단 꼭짓점, 시계방향을 기준으로 잡았다.) 각 지점의 그 방향의 거리들을 미리 계산해두자.

 

이와 같이 계산해둔 값들을 이용하면 문제에서 구하는 값들을 min(두 기준거리의 차와, 반대방향(블록의 둘레 - 기준거리의 차)과 같이 빠르게 계산해낼 수 있다. 이 값들을 더해 문제를 해결하자.

 

주어지는 블록의 크기는 가로길이가 먼저 주어짐에 유의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int R, C;
int dist[100];
int dirX, lX, distX;
int ans = 0;

int main() {
	ios::sync_with_stdio(0);
	cin.tie();

	cin >> C >> R;

	int K; cin >> K;
	for (int k = 0; k < K; k++) {
		int dir, l; cin >> dir >> l;
		if (dir == 1) dist[k] = l;
		else if (dir == 4) dist[k] = C + l;
		else if (dir == 2) dist[k] = C + R + (C - l);
		else dist[k] = C + R + C + (R - l);
	}

	cin >> dirX >> lX;
	if (dirX == 1) distX = lX;
	else if (dirX == 4) distX = C + lX;
	else if (dirX == 2) distX = C + R + (C - lX);
	else distX = C + R + C + (R - lX);

	for (int k = 0; k < K; k++) {
		int tmp = abs(dist[k] - distX);
		ans += min(tmp, 2 * R + 2 * C - tmp);
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 27310 // C++] :chino_shock:  (0) 2023.02.06
[BOJ 6081 // C++] Hay Expenses  (0) 2023.02.06
[BOJ 22098 // C++] Треугольники  (0) 2023.02.05
[BOJ 2562 // C++] 최댓값  (0) 2023.02.05
[BOJ 2566 // C++] 최댓값  (0) 2023.02.04

+ Recent posts