1일1알

백준 2564번 경비원 C++ 본문

알고리즘

백준 2564번 경비원 C++

영춘권의달인 2021. 11. 12. 14:05

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

경비원의 위치가 주어지고, 상점들의 위치가 주어졌을 때, 경비원의 위치에서 상점의 위치까지의 최솟값들을 구해서 더하는 문제이다.

 

내가 해결한 방법은 구조체를 이용하여 입력받은 상점들의 위치를 저장하고 만약 위치가 1이나 2 (북쪽, 남쪽) 이면 왼쪽 꼭짓점까지의 거리와 오른쪽 꼭짓점까지의 거리를 저장하고, 위치가 3이나 4(서쪽, 동쪽) 이면 위쪽 꼭짓점까지의 거리와 아래쪽 꼭짓점까지의 거리를 저장하였다.

 

그리고 상점의 위치정보를 저장한 구조체를 벡터에 담고 벡터를 하나씩 순환하면서 각각의 상황마다 경비원과 상점의 거리의 최솟값을 구해서 더해주면서 문제를 해결하였다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>

using namespace std;
typedef long long ll;

int x, y;

struct store_info {
	store_info(int lotation, int dist) {
		this->lotation = lotation;
		dist_left = 0;
		dist_right = 0;
		dist_up = 0;
		dist_down = 0;
		if (lotation <= 2) {
			dist_left = dist;
			dist_right = x - dist;
		}
		else {
			dist_up = dist;
			dist_down = y - dist;
		}
	}
	int lotation;
	int dist_left;
	int dist_right;
	int dist_up;
	int dist_down;
};

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int t, lot, dis;
	cin >> x >> y >> t;
	vector<store_info> v;
	while (t--) {
		cin >> lot >> dis;
		v.push_back(store_info(lot, dis));
	}
	int mylot, mydis;
	cin >> mylot >> mydis;

	int sum = 0;
	for (auto a : v) {
		int dist1 = 0;
		int dist2 = 0;
		int mindist = 0;
		if (mylot <= 2) {
			if (a.lotation <= 2) {
				if (mylot == a.lotation) {
					mindist = abs(mydis - a.dist_left);
				}
				else {
					dist1 = mydis + a.dist_left + y;
					dist2 = x - mydis + a.dist_right + y;
					mindist = min(dist1, dist2);
				}
			}
			else {
				if (a.lotation == 3) {
					if (mylot == 1) {
						mindist = mydis + a.dist_up;
					}
					else {
						mindist = mydis + a.dist_down;
					}
				}
				else {
					if (mylot == 1) {
						mindist = (x - mydis) + a.dist_up;
					}
					else {
						mindist = (x - mydis) + a.dist_down;
					}
				}
			}
		}
		else {
			if (a.lotation <= 2) {
				if (a.lotation == 1) {
					if (mylot == 3) {
						mindist = mydis + a.dist_left;
					}
					else {
						mindist = mydis + a.dist_right;
					}
				}
				else {
					if (mylot == 3) {
						mindist = (y - mydis) + a.dist_left;
					}
					else {
						mindist = (y - mydis) + a.dist_right;
					}
				}
			}
			else {
				if (mylot == a.lotation) {
					if (mylot == a.lotation) {
						mindist = abs(mydis - a.dist_up);
					}
				}
				else {
					dist1 = mydis + a.dist_up + x;
					dist2 = (y - mydis) + a.dist_down + x;
					mindist = min(dist1, dist2);
				}
			}
		}
		sum += mindist;
	}
	cout << sum;
};