C++:: 프로그래머스 < 두 원 사이의 정수 쌍 >

jahlee·2023년 4월 25일
0

프로그래머스_Lv.2

목록 보기
38/106
post-thumbnail

큰원에 포함되는 점에서 작은 원 내부에 포함되는 점들을 빼면 되는 문제이다. 처음에 접근할때는 단순히 큰원에 포함되는 점 - 작은원에 포함되는 점 + 4를 해주었는데 이러한 풀이가 틀리는 이유는 예시로 작은원의 반지름이 5인경우이다.
작은원의 반지름이 5인경우 원내부가 아닌 원위에있는 점이 4개가 아니게 되므로 이에 대한 생각을 해주어야한다. 그래서 큰반지름은 원에있는 모든점을 구했고, 작은 반지름은 원위의 점을 제외한 내부의 점들을 구해 그 차이를 리턴했다.

반지름이 10^6까지가 범위이므로 자료형을 주의해서 사용하여야 한다. 아래코드는 전부 long long 으로 변환하였고, int형에는 1LL을 곱해주었다.

#include <string>
#include <vector>
#include <cmath>
using namespace std;

long long cnt_dots(int r)
{//원위의 점을 포함한 모든점
    long long cnt = r;
    for(int i=1;i<r;i++)
        cnt += (long long)sqrt(1LL*r*r - 1LL*i*i);
    return cnt*4+1;
}

long long cnt_inside_dots(int r)
{//원위의 점을 제외한 내부의 점
    long long cnt = r - 1;
    for(int i=1;i<r;i++)
    {
        long long tmp = (long long)sqrt(1LL*r*r - 1LL*i*i);
        if(tmp*tmp + 1LL*i*i == 1LL*r*r) cnt += tmp - 1;
        else cnt += tmp;
    }
    return cnt*4+1;
}

long long solution(int r1, int r2)
{
    return cnt_dots(r2) - cnt_inside_dots(r1);
}

0개의 댓글