본문 바로가기

알고리즘

[프로그래머스] 두 원 사이의 정수 쌍 C++ 문제풀이

문제 풀이

문제 풀이 자체는 그리 어렵지 않았다. 두 원 사이의 점이기 때문에 xy축 4분면에 동일한 점들이 생길것이다.

그러니깐 하나의 사분면을 구한 뒤 * 4를 해주면 되는 문제였다.

for문을 통해 y를 하나씩 증가시키면서 x축상의 점의 갯수를 구했다.

그러나 테스트케이스 7,8,9,10에서 계속 실패해서 뭐지...? 하느라 시간이 오래걸렸다.

이유를 알고보니 y*y를 하는 과정에서 overflow가 발생한것이다.

이를 방지하기 위해 캐스팅이라는걸 사용했는데...

캐스팅이 뭐냐하면

   int i = 10;
   long long c = i;         // 묵시적 캐스트
   long long c = (long long) i;  // 명시적 캐스트 (c-style)

이런식으로 자료형 간 형변환시 사용되는 거라고 한다. (처음 알았다!!)

소스 코드

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

//x^2 + y^2 이 r1^2 보다는 크고 r^2보다는 작으면 됨....
long long solution(int r1, int r2) {
    long long answer = 0;
    long long square_r1 = (long long) r1 * r1;
    long long square_r2 = (long long) r2 * r2;
    
    for(int y = 0; y < r1; y++){
        long long new_r1 = ceil(sqrt(square_r1 - (long long) y * y));
        long long new_r2 = floor(sqrt(square_r2 - (long long) y * y));
        if(y == 0){
            answer += 2 * (new_r2 - new_r1 + 1); 
        }
        else {
            answer += 4 * (new_r2 - new_r1 + 1);            
        }
    }
    
    for(int y = r1; y < r2; y++){
        long long new_r2 = floor(sqrt(square_r2 - (long long) y * y));
        answer += (4 *(new_r2) + 2);
    }
    
    answer += 2;
    
    return answer;
}