알고리즘/정보올림피아드
1103. 경비원
병인
2019. 10. 14. 10:46
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=383&sca=50&page=2
JUNGOL | 경비원 > 문제은행
제한시간: 1000 ms 메모리제한: 64 MB 해결횟수: 408 회 시도횟수: 1068 회 동근이는 무인 경비 회사 경비원으로 항상 대기하고 있다가 호출이 들어오면 경비차를 몰고 그 곳으로 달려가야 한다. 동근이가 담당하고 있는 곳은 직사각형 모양의 블록으로 블록 중간을 가로질러 차가 통과할만한 길이 없다. 이 블록 경계에 무인 경비를 의뢰한 상점들이 있다. 예를 들어 가로의 길이가 10, 세로의 길이가 5인 블록의 경계에 무인 경비
www.jungol.co.kr
아무 생각 없이 푸는 시뮬레이션 문제이다.
<JAVA>
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class pos {
int dir;
int pos;
pos(int dir, int pos) {
this.dir = dir;
this.pos = pos;
}
}
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int r, c;
int N;
int result = 0;
r = Integer.parseInt(st.nextToken(" "));
c = Integer.parseInt(st.nextToken(" "));
N = Integer.parseInt(br.readLine());
pos[] shop = new pos[N];
for (int i = 0; i < N; ++i) {
st = new StringTokenizer(br.readLine(), " ");
shop[i] = new pos(Integer.parseInt(st.nextToken(" ")), Integer.parseInt(st.nextToken(" ")));
}
st = new StringTokenizer(br.readLine(), " ");
pos dong = new pos(Integer.parseInt(st.nextToken(" ")), Integer.parseInt(st.nextToken(" ")));
for (int i = 0; i < N; ++i) {
if (shop[i].dir == dong.dir) {
result += Math.abs(shop[i].pos - dong.pos);
} else {
switch (dong.dir) {
case 1: // 북
if (shop[i].dir == 3) {
result += (dong.pos + shop[i].pos);
} else if (shop[i].dir == 4) {
result += (r - dong.pos + shop[i].pos);
} else if (shop[i].dir == 2) {
result += Math.min(dong.pos + c + shop[i].pos, r - dong.pos + c + r - shop[i].pos);
}
break;
case 2: // 남
if (shop[i].dir == 3) {
result += (dong.pos + c - shop[i].pos);
} else if (shop[i].dir == 4) {
result += (r - dong.pos + c - shop[i].pos);
} else if (shop[i].dir == 1) {
result += Math.min(dong.pos + c + shop[i].pos, r - dong.pos + c + r - shop[i].pos);
}
break;
case 3: // 서
if (shop[i].dir == 1) {
result += (dong.pos + shop[i].pos);
} else if (shop[i].dir == 2) {
result += (c - dong.pos + shop[i].pos);
} else if (shop[i].dir == 4) {
result += Math.min(dong.pos + r + shop[i].pos, c - dong.pos + r + c - shop[i].pos);
}
break;
case 4: // 동
if (shop[i].dir == 1) {
result += (dong.pos + r - shop[i].pos);
} else if (shop[i].dir == 2) {
result += (c - dong.pos + r - shop[i].pos);
} else if (shop[i].dir == 3) {
result += Math.min(dong.pos + r + shop[i].pos, c - dong.pos + r + c - shop[i].pos);
}
break;
}
}
}
System.out.println(result);
}
}
<C++>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct pos {
int dir;
int p;
};
int main() {
cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
int r, c;
int N;
int result = 0;
int dir, p;
cin >> r >> c;
cin >> N;
pos* shop = new pos[N];
for (int i = 0; i < N; ++i) {
cin >> dir >> p;
shop[i] = { dir,p };
}
cin >> dir >> p;
pos dong = { dir,p };
for (int i = 0; i < N; ++i) {
if (shop[i].dir == dong.dir) {
result += abs(shop[i].p - dong.p);
}
else {
switch (dong.dir) {
case 1: // 북
if (shop[i].dir == 3) {
result += (dong.p + shop[i].p);
}
else if (shop[i].dir == 4) {
result += (r - dong.p + shop[i].p);
}
else if (shop[i].dir == 2) {
result += min(dong.p + c + shop[i].p, r - dong.p + c + r - shop[i].p);
}
break;
case 2: // 남
if (shop[i].dir == 3) {
result += (dong.p + c - shop[i].p);
}
else if (shop[i].dir == 4) {
result += (r - dong.p + c - shop[i].p);
}
else if (shop[i].dir == 1) {
result += min(dong.p + c + shop[i].p, r - dong.p + c + r - shop[i].p);
}
break;
case 3: // 서
if (shop[i].dir == 1) {
result += (dong.p + shop[i].p);
}
else if (shop[i].dir == 2) {
result += (c - dong.p + shop[i].p);
}
else if (shop[i].dir == 4) {
result += min(dong.p + r + shop[i].p, c - dong.p + r + c - shop[i].p);
}
break;
case 4: // 동
if (shop[i].dir == 1) {
result += (dong.p + r - shop[i].p);
}
else if (shop[i].dir == 2) {
result += (c - dong.p + r - shop[i].p);
}
else if (shop[i].dir == 3) {
result += min(dong.p + r + shop[i].p, c - dong.p + r + c - shop[i].p);
}
break;
}
}
}
cout << result;
return 0;
}