[BaekJoon] 3009번 - 네 번째 점 (java)

1. 문제

👉 문제 바로가기

- 조건

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


- 문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.



- 입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.



- 출력

직사각형의 네 번째 점의 좌표를 출력한다.



- 예제

  입력      출력  
5 5
5 7
7 5
7 7
30 20
10 10
10 20
30 10





2. 풀이

2-0. 알고리즘

4개의 좌표(x, y)로 직사각형을 만드려면 각각의 x, y 값들은 쌍을 이뤄야 한다.

예를 들면, (3, 6), (7, 6), (7, 1), (3, 1) 4개의 좌표가 있다.
x 좌표 값 3과 7은 각각 쌍을 이루고, y 좌표 값 1과 6 또한 쌍을 이룬다.

따라서 4번째 점의 좌표를 출력하려면 쌍을 이루지 않는 x, y의 값을 찾으면 된다.





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

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



2-1. Scanner 클래스

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int[] coord_x = new int[3];
        int[] coord_y = new int[3];
        
        for(int i = 0; i < 3; i++){
            coord_x[i] = sc.nextInt();
            coord_y[i] = sc.nextInt();
        }

        int x = 0, y = 0;
        
        if(coord_x[0] == coord_x[1]){
            x = coord_x[2];
        }else if(coord_x[0] == coord_x[2]){
            x = coord_x[1];
        }else{
            x = coord_x[0];
        }
        if(coord_y[0] == coord_y[1]){
            y = coord_y[2];
        }else if(coord_y[0] == coord_y[2]){
            y = coord_y[1];
        }else{
            y = coord_y[0];
        }
        System.out.println(x + " " + y);
    }
}

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

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



[여기서 잠깐!]

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




2-2. BufferedReader 클래스 사용

BufferedReader는 readLine() 메서드를 사용해 한 행을 전부 읽는다.
이를 공백단위로 분리해야 하는데, 두가지 분리 방법으로 문제를 풀어보자.



     ① StringTokenizer 클래스를 사용하여 분리해주는 방법
     ② split() 을 사용하는 방법



① StringTokenizer 클래스를 이용

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()," ");
        
        String[] coord_1 = {st.nextToken(),st.nextToken()};
        st = new StringTokenizer(br.readLine()," ");
        String[] coord_2 = {st.nextToken(),st.nextToken()};
        st = new StringTokenizer(br.readLine()," ");
        String[] coord_3 = {st.nextToken(),st.nextToken()};
        
        String x, y;
        
        if(coord_1[0].equals(coord_2[0])){
            x = coord_3[0];
        }else if(coord_2[0].equals(coord_3[0])){
            x = coord_1[0];
        }else{
            x = coord_2[0];
        }
        if(coord_1[1].equals(coord_2[1])){
            y = coord_3[1];
        }else if(coord_2[1].equals(coord_3[1])){
            y = coord_1[1];
        }else{
            y = coord_2[1];
        }
        System.out.println(x + " " + y);
    }
}

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

String 데이터의 값을 비교할 때는 “ == “ 가 아닌 equals() 를 사용한다.



[여기서 잠깐!]

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





① split() 메소드 이용

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        
        String[] coord_1 = br.readLine().split(" ");
        String[] coord_2 = br.readLine().split(" ");
        String[] coord_3 = br.readLine().split(" ");
        
        String x, y;
        
        if(coord_1[0].equals(coord_2[0])){
            x = coord_3[0];
        }else if(coord_2[0].equals(coord_3[0])){
            x = coord_1[0];
        }else{
            x = coord_2[0];
        }
        if(coord_1[1].equals(coord_2[1])){
            y = coord_3[1];
        }else if(coord_2[1].equals(coord_3[1])){
            y = coord_1[1];
        }else{
            y = coord_2[1];
        }
        System.out.println(x + " " + y);
    }
}

split() 을 사용해 readLine() 으로 입력받은 값을 공백(" ") 기준으로 나누어 String 배열에 저장한다.





3. Scanner VS BufferedReader 성능 비교

image

위에서 부터 순서대로

BufferedReader + StringTokenizer
BufferedReader + split()
Scanner

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





관련 페이지

Categories:

Updated:

Leave a comment