오늘의 코드

오늘의 코드. 1.5일차 (백준/1085번 직사각형에서 탈출)

오늘의 코드 2024. 2. 5. 15:13
이번에야말로 만만해보이는 문제를 고르고 골라왔다.
그래도 양심없이 이걸 하루치로 올리진 않겠다.

 

Baekjoon / Problem No. 1085  (직사각형에서 탈출)

 

Problem

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

Input

첫째 줄에 x, y, w, h가 주어진다.

Output

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


Solution 1

우선 한눈에 들어오도록 그림으로 그려보자 (GeoGebra 계산기를 사용하였습니다.)

 

위 그림과 같이 한수는 직사각형 속에 갇혀있다. 

과연 어디로 나가야 최단거리로 경계에 도착할 수 있을까? 

 

우선 직선이어야 한다.

 

위 그림에서 볼 수 있듯 직선 f (직선거리)와 직선 g(대각선거리)를 비교해보면 대각선 길이가 길다.

 

그렇다면 한수는 직선거리중 어느 경계면쪽의 직선거리가 가장 짧은지 따져보면 될것이다.

그리하여 한수의 위치를 X성분과 Y성분으로 나누어 보자. (이 표현이 정확한지는 모르겠다.)

 

위 그림을 볼때 " X성분 1, X성분 2, Y성분 1, Y성분 2 " 중에서 가장 짧은 거리를 찾는 것이 해결방법이겠다.

 

 

이를 실제 길이에 대한 식으로 나타내보면 ( x, y, w - x, h - y )이므로 이들중 최솟값을 찾을 수 있다. 

드디어 한수는 직사각형으로부터 도망칠 수 있게 되었다.


Code

#include <stdio.h>

int main()
{
    int x, y, w, h;
    int x1, x2, y1, y2; // X성분 1, X성분 2, Y성분 1, Y성분 2

    int min; // 최솟값 비교에 사용 

    scanf("%d %d %d %d", &x, &y, &w, &h);

    x1 = x;
    x2 = w - x;

    y1 = y;
    y2 = h - y;

    min = (x1 < x2) ? x1 : x2;       // 삼항 연산자를 사용, 비교
    min = (min < y1) ? min : y1;
    min = (min < y2) ? min : y2;

    printf("%d", min);
    // 한수 (은)는 무사히 도망쳤다...
}

위 코드의 사진이다.

 


Review

사실 아이디어 자체는 크게 어렵지 않았다.

다만 코드를 짜는 과정에서 조건문과 반복문 등을 생각해 볼 수 있는데,  간단한 비교라면 삼항연산자 쪽이 더

효율적이다. (코드 길이로 보나 시인성으로 보나) 어찌보면, 난잡하게 조건문, 반복문을 반복하여 쓰는것 보단

효율적이고 간단하게, 보기 쉽게 문제를 풀 수 있는 능력이 앞으로 코딩을 하면서 꼭 필요하지 않을까?