https://www.acmicpc.net/problem/1085
1085번: 직사각형에서 탈출
한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램
www.acmicpc.net
문제
한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 x, y, w, h가 주어진다.
출력
첫째 줄에 문제의 정답을 출력한다.
첫 번째 시도
package ex1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main3 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String a[] = br.readLine().split(" ");
float x = Float.parseFloat(a[0]);
float y = Float.parseFloat(a[1]);
float w = Float.parseFloat(a[2]);
float h = Float.parseFloat(a[3]);
if(x>=w/2&&y>=h/2) {
if(w-x>=h-y) {
System.out.println((int)(h-y));
}else if(w-x<h-y) {
System.out.println((int)(w-x));
}
}
else if(x<w/2&&y>=h/2) {
if(x>=h-y) {
System.out.println((int)(h-y));
}else if(x<h-y) {
System.out.println((int)x);
}
}
else if(x<w/2&&y<h/2) {
if(x>=y) {
System.out.println((int)y);
}else if(x<y) {
System.out.println((int)x);
}
}
else if(x>=w/2&&y<h/2) {
if(w-x>=y) {
System.out.println((int)y);
}else if(w-x<y) {
System.out.println((int)(w-x));
}
}
}
}
- 처음에는 직사각형의 구간을 4등분해서 풀었다. 주어진 직사각형의 가로 세로의 절반이 되는 정 중앙의 점을 기준으로 4등분했다. 그 4등분한 각 면에서 다시 x좌표와 y좌표 중 가까운 좌표를 그대로 출력하거나 가로 또는 세로의 길이와 빼서 출력했다. 문제를 푸는 도중 틀렸다고 나온 경우가 있었는데, 정수형에서 그냥 나눗셈 연산을 할 경우 몫만 나오기 때문에 계산에 오차가 생겼다. 따라서 Float형으로 바꿔 계산한 후 다시 Int형으로 바꿔 출력했다.
참고
- 위 코드를 작성할 때 아래의 코드를 참고했다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
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());
//x,w-x,y,h-y중 가장 작은 값
int[] arr = {x,w-x,y,h-y};
int min = x;
for(int i=0;i<arr.length;i++) {
if(min > arr[i]) {
min = arr[i];
}
}
System.out.println(min);
}
}
반응형
'알고리즘 문제 풀이 (Problem Solving)' 카테고리의 다른 글
[Problem Solving/Java] 백준 4153번 - 직각삼각형 (0) | 2024.01.02 |
---|---|
[Problem Solving/Java] 백준 3009번 - 네 번째 점 (1) | 2024.01.02 |
[Problem Solving/Java] 백준 4948번 - 베르트랑 공준 (2) | 2024.01.02 |
[Problem Solving/Java] 백준 1929번 - 소수 구하기 (0) | 2024.01.02 |
[Problem Solving/Java] 백준 2581번 - 소수 (0) | 2023.08.30 |