[Java] 백준 1085번: 직사각형에서 탈출

hansung's·2024년 2월 28일
0

문제 url:
직사각형에서 탈출

문제

🤔 문제 알아보기

  • 첫째 줄에 x, y, w, h가 주어진다.
    • 여기서 x, y는 현재 좌표이며 w, h는 끝점으로 직사각형의 길이를 나타낸다고 볼 수 있다.
  • 문제는, 직사각형의 경계선(가로변 혹은 세로변으로 해석하면 된다.)까지 가는 거리의 최솟값을 구하면 된다.
  • 그렇다면, x값이 0에 가까운지 아니면 w에 가까운지 판별
  • 그리고 y값이 0에 가까운지 h에 가까운지를 판별
  • 그렇게 나온 값들 중에서 가장 최솟값을 구하면 해당 문제를 풀 수 있다.

🐱‍👤 실제 코드

import java.io.*;
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());

        if((x-0) <= (w-x) && (x-0) <= (h-y) && (x-0) <= (y-0)) {
            System.out.println(x-0);
            
        } else if((y-0) <= (w-x) && (y-0) <= (h-y) && (y-0) <= (x-0)) {
            System.out.println(y-0);

        } else if((w-x) <= (h-y) && (w-x) <= (y-0) && (w-x)<= (x-0)) {
            System.out.println(w-x);
        } else {
            System.out.println(h-y);
        }

    }
}

굉장히 복잡하게 짜놨다. 간단하게 설명하면, 출력값에 나와 있는 값이 최솟값이 될 수 있는 경우의 수들을 입력한것으로 해석할 수 있다.

🤢 코드 리팩토링

음 역시나 코드가 좋은 코드는 아니다. 그래서 또 비교를 하며 찾아보니,
Math.min이라는 최솟값을 찾아주는 내장함수가 존재한다. 이를 이용해서 코드 리팩토링을 진행해보겠다.

import java.io.*;
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());
			
        // x가 0에 가까운지 혹은 w에 가까운지를 판별하는 작업
        int min_x = Math.min(x-0 , w-x); 
        
        // y가 0에 가까운지 혹은 h에 가까운지를 판별하는 작업
        int min_y = Math.min(y-0 , h-y); 

		// 나온 값들 중 그 안에서도 가장 가까운 값을 구분해 출력
        System.out.println(Math.min(min_x, min_y));

    }
}

이렇게 하니 4ms 정도 더 빨라졌긴 했다.
거기에 코드 가독성이 훨씬 좋아졌으며 코드 역시 짧아졌기에 바로 보면 이해할 수 있어졌다.

💜 참고 자료

[백준] 1085번 : 직사각형에서 탈출 - JAVA [자바]
Stranger's LAB

profile
ABAPER를 꿈꾸는 개발자

0개의 댓글