Make Unreal REAL.
article thumbnail
Level 2. 두 원 사이의 정수 쌍

 

 

1사분면에 해당하는 점의 개수를 구한 후 4를 곱하는 방식이다.

 

x를 1 ~ r₂까지 증가시키면서 삼각함수를 이용해 원₁의 y₁좌표, 원₂의 y₂좌표를 구한다.

 

두 y좌표를 빼 계산한 값이 x = t에서의 점 개수이고 이것을 반복해 더해 정답을 구한다.

 

그런데 40%밖에 정답 처리되지 않았다..

 

복잡한 코드도 아니라서 어디가 문제인지 도통 감이 안 잡히고, 아무래도 삼각함수 값을 구하는 과정에서 오차로 인해 문제가 발생하는 것 같다.

 

// 이 풀이는 틀린 풀이다.
#include <iostream>
#include <cmath>
#include <algorithm>

using namespace std;

long long solution(int r1, int r2)
{
    long long answer = 0;

    for (double x = 1; x <= r2; ++x)
    {
        double theta1 = acos(min(x / r1, 1.0));
        double theta2 = acos(x / r2);

        double Y1 = r1 * sin(theta1);
        double Y2 = r2 * sin(theta2);

        answer += floor(Y2) - ceil(Y1) + 1;
    }

    return answer * 4;
}

 

첫 번째 방법과 동일하게 높이를 이용하는 방법인데, 삼각함수 대신 제곱근을 이용해 높이를 직접 구하면 정답 처리된다.

 

제곱을 매번 계산하지 않기 위해 메모를 사용했다.

 

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

long long solution(int r1, int r2)
{
    long long answer = 0;
    vector<double> memo(r2 + 1);

    for (double n = 0; n <= r2; ++n)
        memo[n] = n * n;

    for (int x = 1; x <= r2; ++x)
    {
        double Y1 = sqrt(max(memo[r1] - memo[x], 0.0));
        double Y2 = sqrt(memo[r2] - memo[x]);

        answer += floor(Y2) - ceil(Y1) + 1;
    }

    return answer * 4;
}

'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 3. 여행경로  (0) 2023.07.31
Level 3. 가장 먼 노드  (0) 2023.07.30
Level 2. 후보키  (0) 2023.07.28
Level 2. 마법의 엘리베이터  (0) 2023.07.27
Level 2. 배달  (0) 2023.07.26
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그