쌓고 쌓다
[프로그래머스] 두 원 사이의 정수 쌍 C++ 풀이 및 해설 본문
https://school.programmers.co.kr/learn/courses/30/lessons/181187
풀이 방법
1사분면의 점들의 개수를 구해 *4를 해주면 모든 점들의 개수를 구할 수 있다.
작은 원과 큰 원 사이의 점들을 구하기 위해 원의 방정식을 사용한다.
x는 1부터 r2까지 반복문을 돌리며 각 원의 높이 y를 구한다.
구한 y를 각각 내림과 올림을 해준다.
r1 ceil, r2 floor 하는 이유 : r1보다 크거나 같고 r2보다 작거나 같은 구간의 정수를 구해야하기 때문에 r1을 올림, r2는 내림으로 사이의 정수를 구한다.
그 사이의 정수 개수를 답에 더해준다. 그리고 *4.
long long 타입 변환은 제곱시 int 범위를 넘어 오버 플로우가 나기 때문에 변환 해주자...
전체 코드
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
long long solution(int r1, int r2) {
long long answer = 0;
// x^2+y^2=r^2
for(long long i=1; i<=r2; i++) {
// 원 r1의 밖 영역은 r1의 y를 0으로 가정해야 0부터 r2의 y 까지 정수를 구할 수 있다.
int r1y = 0;
if(i<=r1) {
r1y = ceil(sqrt((((long long)r1*r1)-(i*i))));
}
int r2y = floor(sqrt((((long long)r2*r2)-(i*i))));
answer+=(r2y-r1y+1);
}
// r1 ceil, r2 floor 하는 이유 : r1보다 크거나 같고 r2보다 작거나 같은 구간의 정수를 구해야하기 때문에 r1을 올림, r2는 내림으로 사이의 정수를 구한다.
answer *= 4;
return answer;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 이모티콘 할인행사 C++ 풀이 및 해설 (0) | 2024.02.14 |
---|---|
[프로그래머스] 과제 진행하기 C++ 풀이 및 해설 (1) | 2024.02.05 |
[프로그래머스] 혼자 놀기의 달인 C++ 풀이 및 해설 (1) | 2024.01.06 |
[프로그래머스] 후보키 C++ 풀이 및 해설 (2) | 2024.01.03 |
[프로그래머스] 광물 캐기 C++ 풀이 및 해설 (1) | 2024.01.01 |
Comments