-
프로그래머스 - 두 원 사이의 정수 쌍 [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; }
반응형'문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - [3차] 방금그곡 [C++] (0) 2024.02.01 프로그래머스 - 혼자 놀기의 달인 [C++] (0) 2024.01.17 프로그래머스 - 우박수열 정적분 [C++] (0) 2024.01.16 프로그래머스 - 광물 캐기 [C++] (0) 2024.01.15 프로그래머스 - 디펜스 게임 [C++] (0) 2024.01.14