학습 정리/👨‍💻 PS Study

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

무딘붓 2023. 6. 18. 00:11

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

 

프로그래머스

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

programmers.co.kr

[소스 코드]

 

// 23.06.12
// https://sirius7.tistory.com/

#include <string>
#include <vector>
#include <cmath>

using namespace std;

long long solution(int r1, int r2) {
    long long answer = 0;
    
    for(int i=1;i<r2;i++){
        long long result=0;
        
        long long r1r1 = (long long)r1*r1;
        long long r2r2 = (long long)r2*r2;
        long long ii = (long long)i*i;
        
        long long a; // 안쪽 원 바깥 점 시작범위
        long long b; // 바깥 원 안쪽 점 마지막 범위
        
        b = floor(sqrt( abs((long long)r2r2-ii) ));  
        
        if(abs(i)<r1){
            a = ceil(sqrt( abs(((long long)r1r1-ii))));
            result = (b-a+1);
        }
        else{
            a = 1;
            result = (b-a+1);
        }
        
        answer+=result*4;
    }
    answer+=(r2-r1+1)*4;
    
    return answer;
}

피타고라스 정리를 이용해서 계산해서 푼 문제 입니다.

안쪽 원의 경계까지의 거리와 바깥 원 경계까지의 거리를 구하는데 <cmath> 를 이용했습니다.

 

들어오는 값이 굉장히 크기 때문에

r1,r2 값 등을 곱하거나 계산할 때, long long타입으로 형변환을 잊지 않고 해주셔야 오답이 나오지 않습니다.