본문 바로가기
codingtest

[programmers] 두 원 사이의 정수 쌍

by 안자두 2023. 4. 13.

📝 [Lv2] 두 원 사이의 정수 쌍

👀 문제 설명

x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.
※ 각 원 위의 점도 포함하여 셉니다.

 

🚨 제한 사항

  • 1 ≤ r1 < r2 ≤ 1,000,000

 

💻 입출력 예

r1 r2 result
2 3 20

 

✨ 풀이 설명

r1과 r2가 가지는 원이 각 정수의 x좌표일 때의 y좌표를 구해주어 차를 이용해 점의 개수를 구해주었다.

getY()는 x 좌표와 반지름 r을 넣어 y좌표를 구하는 함수이다.

제1 사분면을 기준으로 계산한 다음, 네 사분면 모두에 대한 값을 계산해 주는 방식을 선택하였다. 원이라는 특성상, 모든 사분면의 크기가 같기 때문이다.
r2를 기준으로 x 좌표를 돌며 각 원에 해당하는 y 좌표를 구해주었다. r1의 반지름을 갖는 원의 경우에는 i가 r1 이상일 경우 무조건 y좌표는 0이 된다.
1부터 시작한 이유는, 0부터 시작하게 되면 네 사분면에 대해 계산할 때, 중복이 생기기 때문이다.
점의 개수는 y1을 올림한 수부터 y2를 내림한 수까지이기 때문에 이를 계산해 answer에 누적해 주었다.

마지막에 4를 곱해 네 사분면 모두의 값을 구하면 끝난다.

 

🕵️‍♂️ 코드

 
function solution(r1, r2) {
  const getY = (x, r) => Math.sqrt(r ** 2 - x ** 2);
  let answer = 0;
  for (let i = 1; i <= r2; i++) {
    const y2 = getY(i, r2), y1 = r1 <= i ? 0 : getY(i, r1);
    answer += Math.floor(y2) - Math.ceil(y1) + 1;
  }
  return answer * 4;
}
728x90

'codingtest' 카테고리의 다른 글

[programmers] 귤 고르기  (0) 2023.04.19
[programmers] 호텔 대실  (0) 2023.04.18
[programmers] 과제 진행하기  (0) 2023.04.12
[programmers] 연속된 부분 수열의 합  (0) 2023.04.11
[programmers] 명예의 전당 (1)  (0) 2023.04.10