https://www.acmicpc.net/problem/1085
[ 문제 ]
한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다.
직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.
[ 입력 ]
첫째 줄에 x, y, w, h가 주어진다.
[ 출력 ]
첫째 줄에 문제의 정답을 출력한다.
[ 제한 ]
[ 입출력 예시 ]
예제 입력 | 예제 출력 |
---|---|
6 2 10 3 | 1 |
1 1 5 5 | 1 |
653 375 1000 1000 | 347 |
161 181 762 375 | 161 |
이번 문제는 본인이 직접 좌표평면에 한수 위치를 표시하고 사각형을 표시해서 어디가 가장 최단거리일지 확인하면 접근하기 쉽다.
1. 한수의 위치 좌표 x, y와 사각형의 가로 세로 길이 w, h 값을 변수(x, y, w, h)에 담아준다.
2. 한수와 사각형 변까지의 거리를 담아줄 변수(dist1)와 한수가 (0, 0)변들로 탈출할 변수(dist)를 선언하여 dist1에는 한수 x좌표와 사각형 가로 길이 w와 한수 y좌표와 사각형 높이 h의 거리중 짧은 값을 dist1에 삼항 연산자로 담아주었다.
3. 한수와 (0, 0)변들과의 거리 x와 y중 짧은 거리를 dist에 삼항 연산자로 담아주었다.
이중 작은 값을 min에 삼항 연산자로 비교하여 담아 출력해주었다.
Math.min()을 이용할 수도 있다.
[ 삼항 연산자를 이용한 풀이 ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
int dist1 = w - x < h - y ? w - x : h - y;
int dist = x < y ? x : y;
int min = dist < dist1 ? dist : dist1;
System.out.println(min);
}
}
[ Math.min()을 이용한 풀이 ] - 풀이 시간이 더 짧지만 메모리가 좀 더 발생함.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
int dist1 = Math.min(w - x, h - y);
int dist = Math.min(x, y);
int min = Math.min(dist, dist1);
System.out.println(min);
}
}