
문제 풀이
문제 풀이 자체는 그리 어렵지 않았다. 두 원 사이의 점이기 때문에 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;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 하노이의 탑 C++ 문제풀이 (0) | 2024.02.27 |
---|---|
[백준] 9576번 책 나눠주기 C++ 문제풀이 (0) | 2024.02.26 |
[프로그래머스] 달리기 경주 C++ 문제풀이 (0) | 2024.02.13 |
[백준] 1753번 최단경로 구하기 C++ 문제풀이 (0) | 2024.02.04 |
[백준] 1916번 최소비용 구하기 C++ 문제풀이 (0) | 2024.02.04 |