본문 바로가기

문제 노트/Atcoder

Opposite( Atcoder 196-D )

문제 : https://atcoder.jp/contests/abc197/tasks/abc197_d

 

D - Opposite

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

 

문제 파악하기

N개의 꼭지점으로 만들어진 정N각형 도형이 있다고 합니다. N개의 꼭지점 중 점 P0(x0, y0)과 PN/2(xN/2, yN/2)가 주어질 때, P1의 위치를 구하는 문제입니다. 문제에서 제공하는 건 2개의 점과 반시계방향으로 번호를 매긴다는 조건입니다. 우리는 이 조건을 이용해서 P0 바로 옆에 있는 P1의 좌표를 구해야 합니다. 이 때, 사용할 수 있는 개념이 바로 삼각함수입니다.

 

 

문제 해결하기

문제를 해결하기 위해서는 삼각함수를 이용하여 P0좌표를 회전시켜주면 됩니다. 여기서 필요한 건 어떤 점을 기준으로 얼만큼 회전시킬 것인지 입니다. 기준점은 제시된 2개의 점의 정중앙입니다. 이 점은 정N각형의 정중앙으로, 여기서 N번 회전시키면 제자리로 돌아오게 됩니다. 따라서, 바로 옆에 있는 P1좌표로 만들기 위해서는 360º/N만큼 회전시키면 됩니다. 그럼 우리는 기준점과 회전각을 알아냈습니다. 그럼 직접 회전시켜봅시다.

 

점을 회전시키기 위해서는 다음 공식을 사용할 수 있습니다.

 

위 공식은 정점을 기준으로 (x, y)를 (x', y')으로 회전시키는 공식입니다. 하지만 우리는 또 다른 정점을 기준으로 회전해야 합니다. 그럼 어떤 방법이 있을까요? 바로 잠시 기준점을 정점으로 이동시키는 방법입니다. 우선, 기준점을 정점(0, 0)으로 이동시킵니다. 그리고 정점에 맞춰 (x, y)도 같이 이동시킵니다. 그 다음, (x', y')로 회전시킵니다. 그리고 마지막으로 이동시켰던 만큼 반대로 (x', y')을 이동시킵니다.

 

위와 같은 과정을 거친다면 우리는 P1의 좌표를 문제없이 출력할 수 있습니다.

 

소스코드

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
#include <stdio.h>
#include <math.h>
 
int N;
int x, y, xx, yy;
 
double Ox, Oy;
double d, retX, retY;
 
int main() {
    // input
    scanf("%d"&N);
    scanf("%d %d"&x, &y);
    scanf("%d %d"&xx, &yy);
    
    // 각도 계산 
    d = M_PI/(N/2.0);
    
    // 중심점 
    Ox = (x+xx)/2.0; Oy = (y+yy)/2.0;
    
    // 회전 
    retX = (x-Ox)*cos(d) - (y-Oy)*sin(d) + Ox;
    retY = (x-Ox)*sin(d) + (y-Oy)*cos(d) + Oy;
    
    // print
    printf("%lf %lf", retX, retY);
}
cs

 

 

후기

오랜만에 풀어보는 앳코더 문제입니다. beginner 단계라서 그런지 그리 어렵지 않은 문제였습니다. 삼각함수를 사용할 수 있다는걸 보여주기에 적절 한 문제라고 생각합니다.

'문제 노트 > Atcoder' 카테고리의 다른 글

Pizza( Atcoder 238-B )  (0) 2022.02.09
Rook Path( Atcoder 232-E )  (0) 2021.12.24
Simple Operations on Sequence( Atcoder 232-F )  (0) 2021.12.20
Construct a Palindrome( Atcoder 196-F )  (0) 2021.11.29
Traveler( Atcoder 196-E )  (0) 2021.11.27