본문 바로가기
백준

[백준] 단계별로 풀어보기(단계:9,기본수학2,JAVA)3053번, 택시 기하학

by 열정적인 이찬형 2022. 1. 6.

문제 링크

3053번: 택시 기하학
 
www.acmicpc.net

주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

처음 문제를 보았을 때에는 택시 기하학이라는 개념이 이해되지 않아서 구글링을 통해 정보를 모아보았습니다.

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

택시 기하학은 출발점을 기점으로 대각선으로 가지 않고 하나의 블럭씩 이동하면 어떤 방식으로 가든 이동한 거리는 같다는 법칙입니다.

일반적으로 원을 살펴보면 중심 좌표와 반지름(r)이 존재하는 아래의 형태입니다.

그래서 대중적으로 알려진 원의 넓이 공식인 r²π을 이용합니다.

하지만 택시 기하학에서의 원의 형태는 우리가 알고 있는 원이 아닌 마름모 형태의 모양을 띄고 있습니다.

왜냐하면 원은 중심에서 반지름만큼에 최단 거리의 집합으로 대각선을 포함하여 표현하지만 택시기하학은 대각선으로이동하는 것을 허용하지 않기 때문에 마름모 형태에 모습을 보이게 됩니다.

검은색으로 그려진 마름모 형태가 택시기하학에서의 원의 표시입니다.

파란색으로 그려진 것을 살펴보면 택시기하학에서는 대각선으로 이동하지 못하기 때문에 한 블록씩 이동하며 반지름이 3이기 때문에 파란색처럼 이동하여 도착하는 지점이 마름모 형태로 만들어질 수 있습니다.

그래서 마름모 공식인 한 대각선 × 다른 대각선 ÷ 2 를 구하면 택시기하학에서 나타내는 원의 넓이를 구할 수 있습니다.

문제에서는 반지름이 주어지기 때문에 공식을(r×2)² ÷ 2 로 구하면 됩니다.

그럼 코드를 살펴보도록 하겠습니다.

 

  • BufferedReader를 사용하여 입력 값을 받았습니다.
  • 원의 넓이, 택시기하학의 원의 넓이를 구하는 함수 circleArea,texiArea를 만들었습니다.
  • 대중적으로 알려진 원의 넓이는 r² * π로 구하였습니다.
  • 택시기하학은 위에 설명한 것처럼 마름모의 넓이로 구하였습니다. (r*2)² ÷ 2 공식을 사용하였습니다.
  • bw에 함수 결과를 저장하였습니다.
  • BufferedWriter를 통해 저장된 결과를 출력하였습니다.

결과 코드

import java.io.*;
import java.math.*;
public class Main{
	public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //BufferedReader를 통해 입력 값 받기
    	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
       	//BufferedWriter를 통해 결과 출력
    	int r = Integer.parseInt(br.readLine());		//반지름 저장
    	bw.write(circleArea(r) + "\n" + texiArea(r) + "\n");	//함수 결과 bw에 저장
    	bw.flush();		//결과 출력
    	bw.close();
    	br.close();	
	}
	public static String circleArea(int r) {		//원의 넓이 구하기
		double temp= r*r*Math.PI;
		String result = String.format("%.6f", temp);
		return result;
	}
	public static String texiArea(int r) {	//택시 기하학 원의 넓이 구하기
		double temp = Math.pow(r*2, 2) / 2;
		String result = String.format("%.6f", temp);
		return result;
	}
}

댓글