본문 바로가기

CS ﹒ Algorithm/Baekjoon

Java 백준 문제풀이 (37) 1085, 3009, 4153, 3053 쉽지만 어려운 문제 4종세트

쉽지만 어려운 문제 4종 세트다.

쉬운 이유 : 딱히 어려운 개념이 없고 구현도 쉬움

어려운 이유 : 중학교 기초 수학이 흐릿해진 나이라면 혼란할 수 있다. 쩝.. 내 얘기 맞다..

 

코드 구현은 전혀 어려운 게 없고 푸는 방법만 알면 되기 때문에 간단하게 정리했다.

 

 

 

 

 

나름 최선을 다해 그렸다.

현수가 있는 좌표인 x,y에서 경계선까지 가는 최단거리는 y, x, h-y, w-x 중 하나일 것이다.

최단거리는 당연히 Math.min으로 구하면 끝이다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
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());
 
        int min1 = Math.min(x,y);
        int min2 = Math.min(w-x,h-y);
 
        System.out.println(Math.min(min1,min2));
    }
}
cs

 

 

 

 

 

 

 

 

축이 평행한 직사각형은 반드시 x의 좌표와 y의 좌표가 2쌍 존재할 수 밖에 없다.

따라서 입력 받은 x,y 값 중 짝이 없는 좌표를 출력하면 된다.

참고로 내가 하드코딩 하기 싫다는 이유로 객기 부리다가 조금 희한하게 풀었다.

마음에 안 들면 다른 풀이를 찾아보자.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main {
    private final static int ANGLE = 4;
    private static boolean[] checkedX = new boolean[ANGLE-1];
    private static boolean[] checkedY = new boolean[ANGLE-1];
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
 
        int[] x = new int[3];
        int[] y = new int[3];
 
        for (int i=0; i<ANGLE-1; i++) {
            st = new StringTokenizer(br.readLine(), " ");
 
            int inputX = Integer.parseInt(st.nextToken());
            int inputY = Integer.parseInt(st.nextToken());
 
            x[i] = inputX;
            y[i] = inputY;
        }
 
        StringBuilder sb = new StringBuilder();
 
        for (int i=0; i<ANGLE-2; i++) {
            for (int j = i+1; j < ANGLE - 1; j++) {
                if (x[i] == x[j]) {
                    checkedX[i] = true;
                    checkedX[j] = true;
                }
                if (y[i] == y[j]) {
                    checkedY[i] = true;
                    checkedY[j] = true;
                }
            }
        }
 
 
        for (int i=0; i< checkedX.length; i++) {
            if (!checkedX[i]) {
                sb.append(x[i]).append(" "); }
        }
 
        for (int i=0; i< checkedY.length; i++) {
            if (!checkedY[i]) { sb.append(y[i]); }
        }
 
        System.out.println(sb.toString());
    }
}
cs

 

 

 

 

 

 

 

피타고라스의 정리 : 직각삼각형에서 빗변 길이의 제곱은 다른 두 변 길이의 제곱의 합과 같다.

쩝.. 이것도 기억이 잘 안 난다는 건 조금 충격적이긴 하다

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main {
    private final static int SIDE = 3;
 
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        double[] sideArr = new double[3];
 
        for (;;) {
            st = new StringTokenizer(br.readLine(), " ");
            int zeroCount = 0;
 
            for (int i = 0; i < SIDE; i++) {
                sideArr[i] = Math.pow(Integer.parseInt(st.nextToken()), 2);
                if ( sideArr[i] == 0 ) zeroCount++;
            }
            
            if (zeroCount==3break;
 
            if (sideArr[0+ sideArr[1== sideArr[2||
                    sideArr[0+ sideArr[2== sideArr[1||
                    sideArr[1+ sideArr[2== sideArr[0]) {
                sb.append("right").append("\n");
            } else {
                sb.append("wrong").append("\n");
            }
        }
 
        System.out.println(sb.toString());
    }
}
cs

 

 

 

 

 

 

 

 

기하학!

ㅋㅋ

죄송합니다.

 

우선 택시 기하학에 대한 건 아래 블로그에 쉽게 정리되어 있다

 

https://itholic.github.io/kata-taxicab-circle/

 

[kata][python] 택시 기하학에서의 원 넓이 구하기

유클리드 기하학과 택시 기하학에서의 원 넓이 구하기

itholic.github.io

 

결론은 택시 기하학에서 원 넓이를 구하는 공식은 2 * R²이다.

다만 공식을 잊어버려도 나중에 다시 풀 수 있도록 설명을 한 번 쯤은 읽어보자.

 

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        double R = Integer.parseInt(br.readLine());
 
        System.out.println(R * R * Math.PI);
        System.out.println(R * R * 2);
    }
}
cs