[프로그래머스] 두 원사이의 정수 쌍

Kim Yuhyeon·2023년 11월 6일
0

알고리즘 + 자료구조

목록 보기
152/161
post-thumbnail

문제

https://school.programmers.co.kr/learn/courses/30/lessons/181187

접근 방법

각 4분면이 동일하므로 1분면만 구한 후 4를 곱해준다.

원의 방정식 (x^2 + y^2 = r^2) 을 이용해
x가 1 ~ r2일때 minY , maxY 를 각각 구한다.

  • minY = root(r1^2 - x^2) 이다. 이 때 올림을 해주어 정수로 만들어준다.
    • x가 r1보다 큰 경우, minY는 무조건 0이 된다.
  • maxY = root(r2^2 - x^2) 이다. 이 때 내림을 해주어 정수로 만들어준다.
    각 정수 내에 있는 것을 고르면 된다.

주의할 점 :
r의 입력값이 최대 백만이므로, 제곱을 하면 범위가 초과될 수 있다. long long으로 타입 변환을 해주기

풀이

#include <string>
#include <vector>
#include <cmath>

using namespace std;



int getY(int x, int r, bool isMin)
{
    // y = root(r^2 - x^2)
    
    if (isMin) return ceil(sqrt((long long)r*r - (long long)x*x));
    else return floor(sqrt((long long)r*r - (long long)x*x));
}

long long solution(int r1, int r2) {
  
    long long answer = 0;
    int minY, maxY;
    
    for(int x=1; x<=r2; x++)
    {
        if (x < r1)
        {
            minY = getY(x, r1, true);
        } 
        else 
        {
            minY = 0;
        }
        
        maxY = getY(x, r2, false);
            
        answer += maxY - minY + 1;
    }
    
    return answer * 4;
}

정리

단순한 듯 어려웠던 문제.. 원의 방정식이 생각이 안났고
원리를 안 후에는 타입이 틀려서 다시 풀었다

참고

https://kjimin0619.tistory.com/63
https://tnsn.tistory.com/6

0개의 댓글