본문 바로가기
Programming/BOJ

[C/C++] 백준 #2564 경비원(구현)

by 작은별하나 2023. 7. 18.
반응형

이번 문제는 기하학적인 이해만 있어도 구현하기가 편합니다.

 

security guard

 

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

 

2564번: 경비원

첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄

www.acmicpc.net

모든 좌표를 기준점에서 시계방향으로 돌 때의 거리로 계산을 하면, 두 지점 사이의 거리를 계산하기 편합니다.  A->B 로 가는 거리와 B->A로 가는 거리 중에 짧은 것을 선택하면 되겠죠.

 

제 경우에는 시계방향으로 돌 때, 왼쪽 아래를 기준점으로 하여서 계산을 했습니다.  이러면 수직선상에 한 점으로 표시될 수 있는데요.  실제 시작지점과 끝지점은 이어진 상태이기 때문에 두 지점 사이의 거리를 계산할 때 나머지 연산을 이용했습니다.

 

제가 작성한 소스입니다.

//------------------------------------------------
//    baekjoon #2564
//        - by Aubrey Choi
//        - created at 2019-08-20
//------------------------------------------------
#include <stdio.h>

int CW(int p, int x, int w, int h)
{
    if(p==1) return h+x;
    if(p==2) return 2*(w+h)-x;
    if(p==3) return h-x;
    return w+h+x;
}

int main()
{
    int w, h, n, store[100], p, x, sum=0;
    scanf("%d%d%d",&w,&h,&n);
    for(int i=0;i<n;i++) { scanf("%d%d", &p, &x); store[i]=CW(p, x, w, h); }
    scanf("%d%d",&p,&x);
    x = CW(p, x, w, h);
    w = 2*(w+h);
    for(int i=0;i<n;i++)
    {
        p = (store[i]-x+w)%w;
        if(p*2 > w) p=w-p;
        sum += p;
    }
    printf("%d\n", sum);
}
728x90

댓글