주녘공부일지

[프로그래머스 C#] Lv.2 두 원 사이의 정수 쌍 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 두 원 사이의 정수 쌍

주녘 2023. 11. 7. 14:36
728x90

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

 

프로그래머스

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

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

직교 좌표계를 기준으로 각 x축 위의 점을 제외하고, y축 위의 점 + 1사분면의 점의 개수를 구하면 되는 문제

- y축 위의 점을 구하고, x 값에 따른 y축의 최소 정수 값 (단, x >= 1) 과 최대 정수 값을 구해 점의 개수를 파악

 

유의사항) int * int 로 인해 int 자료형의 크기 범위를 벗어날 수 있기 때문에 제곱(Pow)연산이 되는 경우에는 long으로 받아줘야 함.!

 

+ 처음엔 y = x 인 직선을 기준으로 1사분면의 영역을 둘로 나눴을 때, 대칭이므로 이를 활용해 최적화를 하려 했었지만, 오히려 로직이 복잡해지며 비용이 더 많이 들 것 같아 다른 방법을 찾았었음

 

주석참조

    using System;

    public class Solution
    {
        public long solution(int r1, int r2)
        {
            // y축 위에 있는 r1 ~ r2 범위 사이의 점의 개수
            long answer = r2 - r1 + 1;
            long rr1 = (long)Math.Pow(r1, 2);
            long rr2 = (long)Math.Pow(r2, 2);

            // x값에 따른 1사분면의 r1 ~ r2 범위의 점의 개수를 찾음
            for (int x = 1; x < r2; x++)
            {
                long xx = (long)Math.Pow(x, 2);
                int maxY = (int)Math.Sqrt(rr2 - xx);

                if (x < r1) // r1 ~ r2
                {
                    int minY = (int)Math.Ceiling(Math.Sqrt(rr1 - xx));
                    answer += maxY - minY + 1;
                }
                else // 1 ~ r2
                    answer += maxY;
            }

            // 2,3,4 사분면의 점 추가
            return answer * 4;
        }
    }
728x90