본문 바로가기

Coding/백준 온라인 저지 (Baekjoon Online Judge)

백준 온라인 저지 (Baekjoon Online Judge) - 1085번 : 직사각형에서 탈출

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

 

1085번: 직사각형에서 탈출

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

www.acmicpc.net

직사각형의 한 쪽 끝은 (0, 0)이고, 다른 한 쪽 끝은 (w, h)이다.

이 때, 현재 점의 위치를 (x, y)라고 하는데,

직사각형의 한 변으로 가는 최소의 거리를 구하는 것이 문제의 핵심이다.

 

처음 이 문제를 풀려고 생각을 해 보았을 때,

직사각형을 가로, 세로 기준으로 각각 2등분,

따라서 총 4개의 작은 직사각형이 나오도록 자르고

그 때 그 영역에 따라서 if-else 구문으로 코드를 작성하려고 하였다.

 

 

위와 같은 방식으로 코드를 작성하려고 하였으나,

x = w / 2 또는 y = h / 2와 같은 경우 또 추가적인 코드를 작성하여야 하고,

저기에 있는 res의 값 또한 정확한 값이 아닐 수 있기 때문에

코드를 다시 작성해야겠다고 생각을 하였다.

 

 

위의 그림을 보면, 점 (x, y)로부터

직사각형의 변까지의 모든 거리를 x, y, w, h를 통해서 값을 표현할 수 있다.

따라서, 저 4가지 값 중에서 제일 작은 값을 출력하면 된다.

 

코드는 아래와 같다.

 

#include <iostream>
using namespace std;

int main() {
	int x, y, w, h;
	cin >> x >> y >> w >> h;
	
	int arr[4];
	
	arr[0] = x;
	arr[1] = y;
	arr[2] = w - x;
	arr[3] = h - y;

	int min = arr[0];

	for (int i = 1; i < 4; i++) {
		if (min > arr[i])
			min = arr[i];
	}
	cout << min;
}