오늘은 기하학과 관련된 문제들이다.
세 문제 모두 간단하게 풀 수 있는 문제들이었다.
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이 아닌 택시 기하학이라는 방법으로 원을 구하는 문제이다.
이 문제의 포인트를 짚어보자.
문제를 읽어보면 이상한 점을 알 수 있다.
우리가 아는 두 점 사이의 거리 공식과 전혀 다르다.
이는 우리가 아는 공식은 두 점 사이의 이론 상의 '최단 거리'를 구하는 공식이기 때문이다.
간단하게 (0,0)과 (1,1)을 집어넣는다고 쳤을 때 두 점 사이의 거리는 √2이다. 하지만 여기서는 2라는 답이 나온다.
답을 찾기 위해서 우리는 공식을 봐야 할 것이다.
두 점 사이의 거리를 구하는 공식을 보면 '두 점의 까지의 가로 + 세로' 이다. 이를 그림으로 그려보면 다음과 같은 그림이 나온다.
위 그림으로 봤을 때 전혀 다른 그림이 나온다.
요점은 택시 기하학에서의 원은 가로와 세로가 같은 다이아몬드 모양이라는 것이다.
위의 넓이를 구하면 2*r^2이 된다.
풀이는 그다지 어렵지는 않으나 여기까지 생각한다는 것 자체는 어려웠던 문제였다.
여담
문제를 풀어보니 왜 '택시' 기하학인지 알 것 같다.
택시에서의 최단거리에는 장애물이 있다는 가정 하에 생각을 해야한다.
빌딩 사이에서 택시를 탔을 때 최단 거리로 가기 위해서 빌딩을 가로질러 갈 수는 없지 않은가.
이러한 계산들은 실생활에도 유용하게 사용되는 것들일 것이다.
나중에 개발자의 일을 하면서도 이러한 유연한 사고가 필요할 것이라 생각한다.