쌓고 쌓다

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

알고리즘/프로그래머스

[프로그래머스] 두 원 사이의 정수 쌍 C++ 풀이 및 해설

승민아 2024. 1. 21. 00:34

https://school.programmers.co.kr/learn/courses/30/lessons/181187

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 방법

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;
}
Comments