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


문제


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

문제 설명 및 풀이


유클리드 기하학과 달리, 택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 D(T1,T2) = |x1-x2| + |y1-y2| 이다.
원은 평면 상의 어떤 점에서 거리가 일정한 점들의 집합인데, 택시 기하학이 이해가 안 간다면, 몇 개 그려보면 된다. 몇 개 그려보면, 마름모꼴의 형태를 띄는 것을 쉽게 알 수 있다. (정확히는 정사각형이지만..)
유클리드 기하학에서의 원의 넓이는 익히 알고 있듯 (π * r * r)이며, 택시 기하학에서의 원의 넓이는 (2 * r * r)이다.
코딩을 할 때 주의할 점으로는, 파이의 선언이다. 문제를 살펴보면 반지름의 최대값이 10,000이므로 원 넓이의 최대 값은 10,000 * 10,000 * π이므로, PI의 선언에 있어 소수점 14번 째 자리까지는 적어주어야 탈락이 없다. 그 이유는 10의 8승이니까 8자리, 거기에 최소 소수점 출력 조건인 6자리를 더한 값이 14이기 때문이다.
이것이 까다롭다면 그냥 cmath안에 있는 M_PI(파이와 같음)를 쓰도록 하자. 그러나 를 선언하기에 앞서 #define _USE_MATH_DEFINES 를 선언해주어야 한다. stackoverflow의 몇몇 글들을 읽어보았는데, 다른 라이브러리나 헤더파일들보다도 먼저 선언해주는 게 좋다고 한다. 어떤 경우에 에러가 난다고 하는 걸 보니...이게 더 복잡한 것 같기도 하다. 마지막으로, 출력서식을 지정해주어야 문제를 통과할 수 있다. c언어의 경우 printf함수의 %.6f 이런식으로, 출력 형식을 쉽게 지정해주었다면, c++의 경우, cout에 fixed와 precision이 있다.

  1. cout « fixed 는 “소수점을 고정시켜 표현하겠다”는 의미이다.
  2. cout.precision(n) 은 “n자리까지 있다면!!! 표현하겠다”라는 의미이다.

결론적으로, fixed가 필요하다. 그렇지 않다면 예제의 1과 같은 수를 입력하면 결과값이 6번 째 자리까지 출력되지 않기 때문이다. 코드는 아래와 같다.

코드