ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - 두 원 사이의 정수 쌍 [C++]
    문제 풀이/프로그래머스 2024. 1. 17. 15:04
    반응형

    이 문제는 수학을 이용해서 푸는 문제이다. 점 찍기 문제와 거의 동일한 문제이다. 한 가지 다른 점은 원 내부에 또 다른 원이 있고, 그 원 안에 점은 포함하지 않는 것이다.

     

    x가 1부터 r2 - 1 까지 루프를 돌며 y좌표를 계산하면 간단히 풀 수 있다. 이 때 유의할 점은 x가 r1 + 1부터 x가 r2 - 1까지인데, 이때는 calculateLow()가 엉뚱한 값을 내놓기 때문에 low를 1로 설정한 뒤 점의 개수를 세어주는 것이다.

     

    또 하나 주의할 점은 이유는 모르겠지만 자료형을 전부 long long으로 놓아야 문제가 제대로 풀린다는 것이다. 두 가지만 주의하면 어렵지 않게 풀 수 있다.

     

    #include <string>
    #include <vector>
    #include <cmath>
    
    using namespace std;
    
    typedef long long ll;
    
    ll calculateHigh(ll x, ll r) {
        ll lx = (ll)x;
        ll lr = (ll)r;
        
        ll ySquare = (r * r - x * x);
        double yRoot = sqrt(ySquare);
        return (ll)yRoot;
    }
    
    ll calculateLow(ll x, ll r) {
        ll lx = (ll)x;
        ll lr = (ll)r;
        
        ll ySquare = (r * r - x * x);
        
        double yRoot = sqrt(ySquare);
        return (ll)ceil(yRoot);
    }
    
    long long solution(int r1, int r2) {
        long long answer = 0;
        
        // 축 위의 점들 구하기
        answer += (r2 - r1 + 1) * 4;
        
        ll temp = 0;
        for (int x = 1; x <= r1 - 1; x++) {
            ll higher = calculateHigh(x, r2);
            ll lower = calculateLow(x, r1);
            
            temp += (higher - lower + 1);
        }
        answer += temp * 4;
        
        ll higher = calculateHigh(r1, r2);
        ll lower = 1;
        
        answer += (higher - lower + 1) * 4;
        
        temp = 0;
        for (int x = r1 + 1; x <= r2 - 1; x++) {
            ll higher = calculateHigh(x, r2);
            ll lower = 1;
            
            temp += (higher - lower + 1);
        }
        answer += temp * 4;
        
        return answer;
    }
    반응형
Designed by Tistory.