[백준-Java] 기본 수학 2(7, 8 , 9, 10번)

RedPanda·2021년 10월 8일
0

[알고리즘] Java

목록 보기
8/16

오늘은 기하학과 관련된 문제들이다.
세 문제 모두 간단하게 풀 수 있는 문제들이었다.

1085번) 직사각형에서 탈출

주어진 좌표로 이루어진 직사각형 안의 x,y 좌표가 직사각형을 빠져나가는 최단거리를 묻는 문제이다.

1사분면 위에 있는 좌표들을 다루는 문제이기 때문에 x축 좌표들의 차이와 y축의 차이만 구한다면 쉽게 구할 수 있는 문제이다.

여기서 함정은 x,y의 좌표가 0에 더 가까운지 주어진 좌표에 더 가까운지이다.

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 T = br.readLine();

        int x = Integer.parseInt(T.split(" ")[0]);
        int y = Integer.parseInt(T.split(" ")[1]);
        int w = Integer.parseInt(T.split(" ")[2]);
        int h = Integer.parseInt(T.split(" ")[3]);
        int height = 0;
        int width = 0;

        if(h-y > y) height = y;
        else height = h-y;
        if(w-x > x) width = x;
        else width = w-x;

        if(height <= width) System.out.println(height);
        else System.out.println(width);
    }
}

3009번) 네 번째 점

이번 문제 역시 1사분면에서의 좌표들을 다루는 문제이다.

직사각형의 네 점 중 세 점이 주어졌을 때 나머지 한 점을 구하는 문제이다.

축에 평행하기 때문에 기울어진 직사각형이 아닌 똑바로 선 사각형이다. 따라서 x좌표가 같은 점 두 개, y좌표가 같은 점 두 개를 찾을 수 있을 것이다.

예시로 나온 값들을 보면 (5,5), (5,7), (7,5)가 있는데 1번과 2번 좌표는 x좌표가 같으므로 이 사각형의 세로는 7-5=2가 되겠고, 1번과 3번의 좌표는 y좌표가 가틍므로 이 사각형의 가로는 7-5=2가 되겠다.

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 T1 = br.readLine();
        String T2 = br.readLine();
        String T3 = br.readLine();

        int x1 = Integer.parseInt(T1.split(" ")[0]);
        int y1 = Integer.parseInt(T1.split(" ")[1]);
        int x2 = Integer.parseInt(T2.split(" ")[0]);
        int y2 = Integer.parseInt(T2.split(" ")[1]);
        int x3 = Integer.parseInt(T3.split(" ")[0]);
        int y3 = Integer.parseInt(T3.split(" ")[1]);

        System.out.println(String.format("%d %d",check(x1,x2,x3),check(y1,y2,y3)));
    }
    public static int check(int a, int b, int c){
        if(a == b) return c;
        else if(a == c) return b;
        else return a;
    }
}

4153번) 직각삼각형

이번 문제는 피타고라스의 정리를 이용한 문제이다.

공식 부분은 넘어가고 공식을 쓰기 위한 준비부터 해보자.

직각삼각형의 가로와 세로는 빗면보다 작아야 한다. 따라서 주어진 a,b,c 중에서 가장 큰 값이 빗면이 되어야 한다.

우리는 a, b, c 중의 최댓값을 구하여 공식을 사용하고 직각삼각형인지 판별하면 된다.

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 T = br.readLine();
        while(!T.equals("0 0 0")){
            int a = Integer.parseInt(T.split(" ")[0]);
            int b = Integer.parseInt(T.split(" ")[1]);
            int c = Integer.parseInt(T.split(" ")[2]);

            int max = max(a,b,c);
            int tmp = 0;
            if(max == 0){
                tmp = a;
                a = c;
                c = tmp;
            }
            else if(max == 1){
                tmp = b;
                b = c;
                c = tmp;
            }

            if(tri(a,b)==c) System.out.println("right");
            else System.out.println("wrong");
            T = br.readLine();
        }

    }
    public static int max(int a, int b, int c){
        int max = Math.max(a,b);
        max = Math.max(max,c);
        if(max == a) return 0;
        else if(max == b) return 1;
        else return 2;
    }
    public static double tri(int a, int b){
        return Math.sqrt(a*a + b*b);
    }
}

3053번) 택시 기하학

마지막 문제는 택시 기하학 이라는 문제이다.

오늘 문제 중에 가장 이해가 안되는 문제였다.
원의 넓이를 구하는 문제인데, 우리가 흔히 사용하는 pi*r^2이 아닌 택시 기하학이라는 방법으로 원을 구하는 문제이다.

이 문제의 포인트를 짚어보자.

  1. 원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합
  2. 두 점 사이의 거리 : D(T1,T2) = |x1-x2| + |y1-y2|

문제를 읽어보면 이상한 점을 알 수 있다.
우리가 아는 두 점 사이의 거리 공식과 전혀 다르다.
이는 우리가 아는 공식은 두 점 사이의 이론 상의 '최단 거리'를 구하는 공식이기 때문이다.

간단하게 (0,0)과 (1,1)을 집어넣는다고 쳤을 때 두 점 사이의 거리는 √2이다. 하지만 여기서는 2라는 답이 나온다.

답을 찾기 위해서 우리는 공식을 봐야 할 것이다.
두 점 사이의 거리를 구하는 공식을 보면 '두 점의 까지의 가로 + 세로' 이다. 이를 그림으로 그려보면 다음과 같은 그림이 나온다.

위 그림으로 봤을 때 전혀 다른 그림이 나온다.

요점은 택시 기하학에서의 원은 가로와 세로가 같은 다이아몬드 모양이라는 것이다.

위의 넓이를 구하면 2*r^2이 된다.

풀이는 그다지 어렵지는 않으나 여기까지 생각한다는 것 자체는 어려웠던 문제였다.

여담

문제를 풀어보니 왜 '택시' 기하학인지 알 것 같다.
택시에서의 최단거리에는 장애물이 있다는 가정 하에 생각을 해야한다.
빌딩 사이에서 택시를 탔을 때 최단 거리로 가기 위해서 빌딩을 가로질러 갈 수는 없지 않은가.
이러한 계산들은 실생활에도 유용하게 사용되는 것들일 것이다.
나중에 개발자의 일을 하면서도 이러한 유연한 사고가 필요할 것이라 생각한다.

profile
끄적끄적 코딩일기

0개의 댓글