Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- c++
- BFS
- XR Interaction Toolkit
- 다이나믹 프로그래밍
- DFS
- 스택
- 재귀
- Unreal Engine 5
- 브루트포스
- 문자열
- VR
- 자료구조
- 백트래킹
- 우선순위 큐
- 시뮬레이션
- 백준
- 트리
- 투 포인터
- 누적 합
- 다익스트라
- Team Fortress 2
- 수학
- 정렬
- 유니온 파인드
- 유니티
- 알고리즘
- 그래프
- ue5
- 그리디 알고리즘
- 구현
Archives
- Today
- Total
1일1알
백준 2564번 경비원 C++ 본문
경비원의 위치가 주어지고, 상점들의 위치가 주어졌을 때, 경비원의 위치에서 상점의 위치까지의 최솟값들을 구해서 더하는 문제이다.
내가 해결한 방법은 구조체를 이용하여 입력받은 상점들의 위치를 저장하고 만약 위치가 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;
};
'알고리즘' 카테고리의 다른 글
백준 1254번 팰린드롬 만들기 C++ (0) | 2021.11.14 |
---|---|
백준 2961번 도영이가 만든 맛있는 음식 C++ (0) | 2021.11.13 |
백준 2589번 보물섬 C++ (0) | 2021.11.11 |
백준 4358번 생태학 C++ (0) | 2021.11.10 |
백준 11497 통나무 건너뛰기 C++ (0) | 2021.11.09 |