BOJ(백준)

[C언어] 백준 - 1085 직사각형에서 탈출

ruming 2022. 2. 23. 23:02

문제

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

입력

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

출력

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

 

너비가 w, 높이가 h인 직사각형이 있고, (x,y)에서 직사각형의 변까지의 최솟값을 구하는 문제이다.

비교할 수는 총 4개가 되겠다.

x, y, w-x, h-y

 

단순히 4개의 값을 구해 비교하면 될 것 같다.

#include <stdio.h>
int main(void) {
	int x, y, w, h;
	scanf("%d%d%d%d", &x, &y, &w, &h);
	int m = (x < y ? x : y) < (w - x < h - y ? w - x : h - y) ? (x < y ? x : y) : (w - x < h - y ? w - x : h - y);
	printf("%d", m);
}

조건연산자를 이용해 해결했다.

중첩해서 사용하느라 길어졌다. 나눠서 쓰면 다음과 같다.

#include <stdio.h>
int main(void) {
	int x, y, w, h;
	scanf("%d%d%d%d", &x, &y, &w, &h);
	int m1 = x < y ? x : y;
	int m2 = w - x < h - y ? w - x : h - y;
	printf("%d", m1 < m2 ? m1 : m2);
}

단순히 4개의 숫자 중 최솟값을 찾으면 되니 순서는 상관이 없다. x와 y를 비교해 작은 값을 m1에 저장, w-x와 h-y를 비교해 작은 값을 m2에 저장한 후 m1과 m2를 비교해 작은 값을 출력하면 그 값이 최솟값이다.