codingtest

두 원 사이의 정수 쌍

2026-08-23
2분 분량
JAVA프로그래머스

문제 링크

문제 요약

  • 원점이 중심인 두 원이 있고 반지름은 각각 r1, r2다 (r1 < r2)
  • 두 원 사이 공간에서 x, y 좌표가 모두 정수인 점의 개수를 구하는 문제다
  • 원 위의 점도 포함해서 센다

문제 풀이

처음에는 x, y 좌표를 이중 for문으로 전부 돌면서 각 점이 두 원 사이에 있는지 판별하면 되겠다고 생각했다.

하지만 r2가 최대 1,000,000이라 x, y 범위도 그만큼 커지는데, 좌표 평면 전체를 다 훑으면 O(r2²)라 시간 안에 절대 끝나지 않는다.

이 문제의 핵심은 두 원이 원점 대칭이므로 1사분면에서만 점의 개수를 세고 4를 곱하면 된다는 점이다.

  • x를 1부터 r2까지 하나씩 늘려가면서, 그 x에서 세로로 들어갈 수 있는 y의 범위를 구한다
  • 큰 원 안에 들어가는 y의 최댓값은 sqrt(r2^2 - x^2)를 내림한 값이다
  • x가 작은 원의 반지름 r1보다 작을 때는, 작은 원 밖으로 나가는 최소 y가 sqrt(r1^2 - x^2)를 올림한 값이어야 한다
  • x가 r1 이상이면 그 세로줄은 어떤 y를 잡아도 이미 작은 원 밖이므로 y=0부터 셀 수 있다
  • 각 x마다 maxY - minY + 1만큼을 더해서 1사분면의 점 개수를 구하고, 마지막에 4를 곱한다

최종 코드

java
class Solution {
    public long solution(int r1, int r2) {
        long answer = 0;

        long r1Square = (long) r1 * r1;
        long r2Square = (long) r2 * r2;

        // 1사분면에서 x를 하나씩 늘려가며 세로줄에 들어갈 y 범위를 구한다
        for (long x = 1; x <= r2; x++) {
            long maxY = (long) Math.floor(
                Math.sqrt(r2Square - x * x)
            ); // 큰 원 안에 들어가는 y의 최댓값

            long minY;

            if (x < r1) {
                minY = (long) Math.ceil(
                    Math.sqrt(r1Square - x * x)
                ); // 작은 원 밖으로 나가는 최소 y
            } else {
                minY = 0; // x가 r1 이상이면 이미 작은 원 밖이므로 y=0부터 셀 수 있다
            }

            answer += maxY - minY + 1;
        }

        return answer * 4; // 나머지 3개 사분면도 대칭이므로 4를 곱한다
    }
}

함께 읽으면 좋은 글

코딩 테스트2026-08-23

택배상자

order 배열은 택배 기사님이 원하는 상자 적재 순서다 기존 컨테이너 벨트는 1번부터 순서대로만 꺼낼 수 있다 보조 벨트는 스택처럼 마지막에 넣은 것부터 꺼낼 수 있다 원하는 순서대로 최대한 실을 수 있는 상자 개수를 구하는 문제다 처음에는 기존 벨트를 실제 리스트로 만들어…

코딩 테스트2026-08-23

롤케이크 자르기

topping 배열은 롤케이크에 일렬로 올라간 토핑 번호다 한 지점을 잘라 두 조각으로 나눴을 때, 양쪽 토핑 종류 수가 같아야 공평하게 나눈 것이다 공평하게 자를 수 있는 방법의 수를 구하는 문제다 처음에는 자르는 위치마다 왼쪽과 오른쪽 배열을 나눠서 각각 서로 다른 토핑…

코딩 테스트2026-08-23

할인 행사

want, number 배열로 정현이가 원하는 제품과 수량을 표현한다 discount 배열은 XYZ 마트가 매일 할인하는 제품 목록이다 연속된 10일 동안 할인 제품 종류와 수량이 want, number와 정확히 일치해야 회원가입할 수 있다 그런 시작일이 총 몇 번 있는지…

코딩 테스트2026-08-23

숫자 변환하기

자연수 x를 y로 바꾸는 데 x+n, x2, x3 세 가지 연산을 쓸 수 있다 x를 y로 바꾸는 최소 연산 횟수를 구하는 문제다 만들 수 없으면 -1을 반환한다 처음에는 x에서 시작해서 세 가지 연산을 재귀적으로 다 시도해보고 y에 도달하는 경로 중 가장 짧은 걸 고르면…