티스토리 뷰

Source

문제

한수는 지금 (x, y)에 있다. 직사각형의 왼쪽 아래 꼭짓점은 (0, 0)에 있고, 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 x y w h가 주어진다. w와 h는 1,000보다 작거나 같은 자연수이고, x는 1보다 크거나 같고, w-1보다 작거나 같은 자연수이고, y는 1보다 크거나 같고, h-1보다 작거나 같은 자연수이다.

출력

첫째 줄에 문제의 정답을 출력한다.

예제 입력 1

6 2 10 3

예제 출력 1

1

해설

간단한 문제라 딱히 설명할 게 없다. 한 가지 주의해야 할 점은 한수의 좌표 H(x, y)에 사각형 오른쪽 상단 좌표 Rec(w, h)에서 w - x, h - y의 절대값을 구해 둘 중 작은 값을 출력하면 된다고 착각하는 것이다.
H(1, 2), Rec(5, 5)이면 w - x = 4, 5 - 2 = 3이 된다. 따라서 최소값은 3될 것이다. 그러나 이는 원하는 출력이 아니다. 이것은 점 H와 사각형의 윗변과 오른쪽변까지의 거리만을 비교한 최소값일 뿐이다. 점 H와 밑변과 왼쪽변까지의 거리도 확인해야 결과를 바르게 출력할 수 있다. 위의 경우라면 왼쪽변까지의 거리 1 - 0 = 1과 밑변까지의 거리 2 - 0 = 2도 비교해야 하면 그렇다면 최소값은 1이 된다. 따라서 이러한 경우를 고려하여 거리를 확인하는 코드를 완성하면 아래와 같다.

result1 = w - x;
result2    = h - y;
if (x <= result1) {
    result1 = x;
}
if (y <= result2) {
    result2 = y;
}

위 코드와 같이 우선 점 H에서 좌우변, 상하변의 거리의 최소값을 구한다. 다시 그중(result1, result2) 최소값은 비교하여 결과를 출력하는 코드를 아래와 같이 완성하였다.

소스코드: C

#include <stdio.h>
int main(int argc, char *argv[])
{
    int x, y, w, h;
    int result1, result2, min;
    scanf("%d %d %d %d", &x, &y, &w, &h);
    result1 = w - x;
    result2    = h - y;
    if (x <= result1) {
        result1 = x;
    }
    if (y <= result2) {
        result2 = y;
    }
    if (result1 <= result2) {
        min = result1;
    } else {
        min = result2;
    }
    printf("%d\n", min);
    return 0;
}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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 31
글 보관함
05-18 23:03