-
백준 경비원 2564 c++알고리즘/백준 2022. 7. 6. 16:06반응형
https://www.acmicpc.net/problem/2564
2564번: 경비원
첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄
www.acmicpc.net
경우의수를 나눠서 구현했다.
1. 반대편에 있는경우
1-1) 가로기준 반대
1-2) 세로기준 반대
2. 오른쪽 or 왼쪽에 있는경우
3. 같은곳에 있는 경우1번 경우가 가장 어려웠는데 이걸 처음부터 하려니까 시간이 오래걸렸다.
가로와 세로의 길이가 다르기 때문에 반대편에 있을때도 가로기준 반대편 세로기준 반대편을 구해줘야했다.
2번의 경우 경우의수가 8가지밖에 안되기때문에 그냥 구현해주는게 더 편할거라 생각해 쌩으로 구현했다.
구현하면서도 스스로 의문점을 가지면서 구현했는데 다음부터는 설계가 끝나면 의심하지말고 일단은 구현해보는 자세를 가져야겠다
#include <iostream> #include <vector> #include <cmath> #include <algorithm> using namespace std; int result = 0; int main(void) { int n,m; //n은 가로 m은 세로 cin >> n >> m; int t; cin >> t; vector< pair <int,int> > v; for(int i=0; i<t; i++) { int a,b; cin >> a >> b; v.push_back({a,b}); } int a,b; cin >> a >> b; v.push_back({a,b}); for(int i=0; i<t; i++) { int tmp = 0; int max_value = -1; if((v[i].first + v[v.size()-1].first) % 4 == 3) { //반대편에 있는경우 if(v[i].first == 1 || v[i].first == 2) { tmp = tmp + abs(v[i].second - v[v.size()-1].second); max_value = max(abs((n/2 - v[v.size()-1].second)),abs((n/2 - v[i].second))); max_value = n/2-max_value; tmp = tmp + max_value * 2 + m; } else if(v[i].first == 3 || v[i].first == 4) { tmp = tmp + abs(v[i].second - v[v.size()-1].second); max_value = max(abs(m/2 - v[v.size()-1].second),abs(m/2 - v[i].second)); max_value = m/2 - max_value; tmp = tmp + max_value * 2 + n; } result = result + tmp; } else if(v[i].first == v[v.size()-1].first) { tmp = abs(v[i].second - v[v.size()-1].second); result = result + tmp; } else { if(v[i].first == 1) { if(v[v.size()-1].first == 3) { tmp = tmp + v[i].second + v[v.size()-1].second; } else if(v[v.size()-1].first == 4) { tmp = tmp + n - v[i].second + v[v.size()-1].second; } } else if(v[i].first == 2) { if(v[v.size()-1].first == 3) { tmp = tmp + v[i].second + m-v[v.size()-1].second; } else if(v[v.size()-1].first == 4) { tmp = tmp + n-v[i].second + m-v[v.size()-1].second; } } else if(v[i].first == 3) { if(v[v.size()-1].first == 1) { tmp = tmp + v[i].second + v[v.size()-1].second; } else if(v[v.size()-1].first == 2) { tmp = tmp + m-v[i].second + v[v.size()-1].second; } } else if(v[i].first == 4) { if(v[v.size()-1].first == 1) { tmp = tmp + v[i].second + n-v[v.size()-1].second; } else if(v[v.size()-1].first == 2) { tmp = tmp + m-v[i].second + n-v[v.size()-1].second; } } result = result + tmp; } } cout << result; return 0; }
728x90반응형'알고리즘 > 백준' 카테고리의 다른 글
백준 12865 평범한 배낭 c++ (0) 2022.08.15 백준 14500 테트로미노 삼성 SW 역량 테스트 기출 문제 c++ (0) 2022.07.06 백준 15686 삼성 SW 역량 테스트 기출 문제 c++ (1) 2022.07.04 백준 14889 스타트와 링크 삼성 SW 역량 테스트 기출 c++ (2) 2022.07.01 백준 14888 삼성 SW 역량 테스트 기출문제 c++ (0) 2022.07.01