Bin's Blog

[프로그래머스] Level2 - 두 원 사이의 정수 쌍(Javascript) 본문

Algorithm

[프로그래머스] Level2 - 두 원 사이의 정수 쌍(Javascript)

hotIce 2023. 11. 7. 11:32
728x90
 

프로그래머스

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

programmers.co.kr

📝문제 요약

1️⃣ X축과 Y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원의 두 개 주어진다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어진다.

2️⃣ 두 원 사이의 공간에 X좌표와 Y좌표가 모두 정수인 점의 개수를 return 하도록 solution 함수를 완성해라. 

 

 

📚중요 포인트

1️⃣ 핵심은 작은 원과 큰 원 사이의 정수인 지점을 구해야 한다. 

2️⃣ 작은 원의 경계선에 있는 점을 세면, 그 점은 큰 원과의 공간에는 포함되지 않는다. 따라서 작은 원의 경계선에 있는 점들을 계산에서 제외한다. 

3️⃣ 원의 방정식을 활용한다. (루트(x -a) ** 2 + (y - b) ** 2) 

 

 

✅ 성공 코드

function solution(r1, r2) {
    let answer = 0;
    // 원점에서 
    for (let i = 0; i < r1; i++) {
        // 실수로 계산된 정수 부분만 추출하기 위해 parseInt 사용
        // 원의 방정식 활용
        // 각 좌표 x에 대해 큰 원(r2),작은 원(r1)의 방정식을 사용하여 큰 원과 작은 원에 속하는 y좌표의 최댓값을 찾는다.
        answer += parseInt(Math.sqrt(r2 ** 2 - i ** 2)) - parseInt(Math.sqrt(r1 ** 2 - i ** 2 -1));
    }
    // 이 구간에는 작은 원(r1) 안에 격자점이 없기 때문에, 큰 원(r2)의 방정식을 사용해서 y값의 최대 정수 부분을 계산한다
    for (let j = r1; j < r2; j++) {
        answer += parseInt(Math.sqrt(r2** 2 - j ** 2));
    }
    
    // 원의 한 사분면만 계산했기 때문에 전체 격자의 수를 얻기 위해 4를 곱한다.
    return answer * 4;
}

 

 

📔느낀점

👉 수학 관련 문제를 풀다보면 수학 공부가 너무 하고 싶어진다.. 수학적 지식을 요구하는 문제가 등장하면 더욱 그렇다.

728x90