[BaekJoon] 1085번 - 직사각형에서 탈출 (java)

1. 문제

👉 문제 바로가기

- 조건

시간 제한 메모리 제한
2초 128MB


- 문제

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

- 입력

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

- 출력

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

- 제한

1 ≤ w, h ≤ 1,000
1 ≤ x ≤ w-1
1 ≤ y ≤ h-1
x, y, w, h는 정수

- 예제

  입력      출력  
6 2 10 3 1
1 1 5 5 1
653 375 1000 1000 347
161 181 762 375 161





2. 풀이



이해를 돕기 위해 아래의 그림을 보자.
한수의 위치 (x, y) 에서 직사각형 변으로의 가장 짧은 거리를 구하는 문제이다.
4개의 길이를 비교해서 최솟값을 구한다. image





2개의 입력방식을 사용해서 결과를 출력한다.

  1. Scanner 클래스
  2. BufferedReader 클래스





2-1. Scanner 클래스

  • 배열 을 사용해 값을 비교한다.

import java.util.Scanner;
import java.util.Arrays;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        
        int x = sc.nextInt(); // 한수의 x축 위치
        int y = sc.nextInt(); // 한수의 y축 위치
        int w = sc.nextInt(); // 직사각형의 가로 길이
        int h = sc.nextInt(); // 직사각형의 세로 길이
            
        int arr[] = {x, w - x, y, h - y};
        Arrays.sort(arr); // 오름차순 정렬
        
        System.out.println(arr[0]);
    }
}

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.

int형 데이터를 입력받기 위해 nextInt() 메서드를 사용한다.

Arrays 클래스의 sort() 를 사용해 인자에 전달된 배열을 오름차순 정렬 한다.



[여기서 잠깐!]

Scanner에 대해 더 자세히 알고싶다면 여기 를 클릭하세요




2-2. BufferedReader 클래스 사용

BufferedReader는 readLine() 메서드를 사용해 한 행을 전부 읽는다.
이를 공백단위로 분리해야 하는데, StringTokenizer 클래스를 사용하여 분리한다.



2가지 정렬 방법을 비교해보자.

  1. 배열 사용 - Arrays.sort()
  2. 배열 사용 X - Math.min()


① 배열 사용 - Arrays.sort()

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
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()); // 한수의 x축 위치
        int y = Integer.parseInt(st.nextToken()); // 한수의 y축 위치
        int w = Integer.parseInt(st.nextToken()); // 직사각형의 가로 길이
        int h = Integer.parseInt(st.nextToken()); // 직사각형의 세로 길이
            
        int arr[] = {x, w - x, y, h - y};
        Arrays.sort(arr); // 오름차순 정렬
        
        System.out.println(arr[0]);
    }
}

readLine() 메서드를 사용해 입력받은 값을 한 줄 통째로 읽어 String 으로 반환한다.

Integer.parseInt()을 사용해 String형을 int형으로 변환시켜준다.

Arrays 클래스의 sort() 를 사용해 인자에 전달된 배열을 오름차순 정렬 한다.



[여기서 잠깐!]

BufferedReader 클래스에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.
Arrays 클래스에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.





② 배열 사용 X - Math.min()

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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()); // 한수의 x축 위치
        int y = Integer.parseInt(st.nextToken()); // 한수의 y축 위치
        int w = Integer.parseInt(st.nextToken()); // 직사각형의 가로 길이
        int h = Integer.parseInt(st.nextToken()); // 직사각형의 세로 길이

        int min = Math.min(Math.min(x, w - x),Math.min(y, h - y));
        
        System.out.println(min);
    }
}

StringTokenizer를 사용해 문자열을 공백단위로 구분한 값들을 토큰 이라고 한다.
while 조건문 에서 hasMoreTokens() 함수 를 사용해 토큰 개수만큼 반복한다.

Math 클래스의 min() 을 사용해 인자에 전달된 두개의 값을 비교해 최솟값을 반환 한다.
값을 반환하기 때문에 인자 안에 또 다른 Math.min() 함수를 넣어도 된다.



[여기서 잠깐!]

Math 클래스에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.





3. 성능 비교

image

위에서 부터 순서대로

BufferedReader + 배열 X
BufferedReader + 배열
Scanner + 배열

입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.

이 문제의 경우는 배열의 크기가 크지않아 큰 차이는 없지만 배열을 사용하지 않은 경우가 조금 빠르다.





관련 페이지

Categories:

Updated:

Leave a comment