본문 바로가기

알고리즘/정보올림피아드

1103. 경비원

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;
}

'알고리즘 > 정보올림피아드' 카테고리의 다른 글

2283. RGB 마을  (0) 2019.10.28