Algorithm/Baekjoon

[백준] 3053번 : 택시 기하학 - Java

unknownomad 2022. 4. 4. 22:32

https://www.acmicpc.net/problem/3053

 

3053번: 택시 기하학

첫째 줄에는 유클리드 기하학에서 반지름이 R인 원의 넓이를, 둘째 줄에는 택시 기하학에서 반지름이 R인 원의 넓이를 출력한다. 정답과의 오차는 0.0001까지 허용한다.

www.acmicpc.net



택시 기하학 = 맨해튼 거리, Manhatten distance

 

https://ko.wikipedia.org/wiki/%EB%A7%A8%ED%95%B4%ED%8A%BC_%EA%B1%B0%EB%A6%AC

빨간색 길이 = 파란색 길이 = 노란색 길이

➡ 2차원 평면에서 가로를 x, 세로를 y라 할 때,
택시 기하학에서의 거리 = 두 점의 x 좌표 차 + 두 점의 y 좌표 차

 

 

유클리드 기하학 택시 기하학
* 그림 상의 초록색 선
* 우리가 평소에 아는 '거리' 개념

D(T₁, T₂)² = (𝑥₁ - 𝑥₂)² + (y₁ - y₂)²

원의 넓이 = 𝜋𝑟² 
               = 3 × 3 × 𝜋 
               = 9𝜋

유클리드 기하학에서의 원의 넓이 = 𝜋𝑟² 
* '거리'의 개념을 새로 정의함

D(T₁, T₂) = |𝑥₁ - 𝑥₂| + |y₁ - y₂|

D = |𝑥| + |y|

원의 넓이 = 2𝑟² 
               = 2 × 3 × 3 
               = 18 

택시 기하학에서의 원의 넓이 = 2𝑟² 

풀이

1. Scanner

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) 
 
        Scanner in = new Scanner(System.in);
 
        //오차 범위 : 0.0001 ➡ double 타입 사용
        //𝜋 = Math.PI
        //public static final double PI = 3.14159265358979323846; (자바 13 기준)
        double R = in.nextDouble(); //반지름 R
        in.close();
		
        System.out.println(R * R * Math.PI); //유클리드 원의 넓이
        System.out.println(2 * R * R); //택시기하학 원의 넓이
    }
}

 

2. BufferedReader

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));
 
        double R = Double.parseDouble(br.readLine()); //반지름 R
	
        System.out.println(R * R * Math.PI); //유클리드 원의 넓이
        System.out.println(2 * R * R); //택시기하학 원의 넓이
    }
}

String ➡ 기본 자료형(Primitive Type)으로 타입 변환하는 방법

  • Wrapper.parseWrapper 사용
  • 자바의 기본 자료형 데이터 타입 + 이에 대응하는 래퍼 클래스
Primitive Type Wrapper Class
byte Byte
short Short
int Int
long Long
float Float
double Double
boolean Boolean
char Character

 

String str = "123456";

byte a = Byte.parseByte(str); //String ➡ byte
short b = Short.parseShort(str); //String ➡ short
int c = Integer.parseInt(str); //String ➡ int
long d = Long.parseLong(str); //String ➡ long
float e  Float.parseFloat(str); //String ➡ float
double f = Double.parseDouble(str); //String ➡ double

String str2 = "true";

boolean g = Boolean.parseBoolean(str2); //String ➡ boolean

//char은 없음
//String ➡ char 하려면 charAt() 활용

성능

  • BufferedReader > Scanner

 


출처 : https://st-lab.tistory.com/89