※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |