기록/개발관련

Chpat GPT의 나의 알고리즘 풀이 법 개선을 요청했다

POWER_ESFJ 2023. 5. 2. 20:30

https://big-wave-on.tistory.com/40

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/181187 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞

big-wave-on.tistory.com

: 코드를 입력 했을 때

 

 

이 코드는 원 두 개의 넓이에 해당하는 값을(살짝 부정확 => 큰 원에 속하면서 작은원에 속하지 않는 정수형 좌표[작은원 테두리에 포함되는 좌표는 포함한다]의 갯수를) 반환하는 문제를 해결하는 Java 프로그램입니다. 두 원의 반지름을 r1과 r2로 지정하고, 각 원의 넓이를 계산한 다음, 두 원의 넓이를 합산하여 반환합니다.(합산이 아니라 빼기인데)

이를 위해, 코드는 먼저 두 원 사이의 영역에 해당하는 값을 계산하기 위해, 반지름이 r2인 원에 대한 x값 범위를 순회합니다. 각 x값에 대해, 해당 x값에 대한 y값의 범위를 계산합니다. 이를 위해, 피타고라스 정리를 사용하여, 원의 반지름과 x값에 대한 y값을 계산합니다. 그런 다음, x값이 r1보다 작은 경우, 해당 x값에 대한 최소 y값을 계산합니다. 최소 y값은 r1 원에서의 y값과 r2 원에서의 y값 중 더 큰 값으로 지정됩니다.

마지막으로, 모든 x값에 대해 y값 범위를 합산하고, 이를 4배한 값을 반환합니다. 이는 두 원의 반대편에 대한 값을 고려하여 계산하는 방식입니다.

 

: 위의 코드를 개선해줘

 

> 해당 코드는 기능적으로는 정상적으로 작동하지만, 다음과 같은 몇 가지 개선 사항이 있습니다.

1. 변수명 개선: x, yMax, yMin 등 변수명이 간결하지 않아 가독성이 떨어집니다. 변수명을 더 명확하게 지정하여 코드를 이해하기 쉽도록 개선할 수 있습니다.

2. 자료형 수정: yMax와 yMin은 실수형으로 선언되어 있지만, 이들 값은 정수형으로 캐스팅된 후 계산되어야 합니다. 따라서, yMax와 yMin의 자료형을 int로 수정하여 불필요한 캐스팅을 제거할 수 있습니다.

3. 코드 중복 제거: Math.sqrt(Math.pow(r2, 2) - Math.pow(x, 2))와 같은 코드가 두 번 이상 반복되고 있습니다. 이를 변수로 선언하여 중복을 제거할 수 있습니다.

4. 효율적인 계산: Math.sqrt()와 Math.pow() 함수는 비교적 느리기 때문에, 계산 효율성을 개선할 수 있습니다. 예를 들어, x^2와 r1^2, r2^2를 미리 계산하고, 루트 연산을 나중에 수행하는 방식으로 개선할 수 있습니다.

다음은 개선된 코드입니다.

public class Solution_029_181187 {
    public long solution(int r1, int r2) {
        long sum = 0;
        int r1Square = r1 * r1;
        int r2Square = r2 * r2;
        for (int x = 1; x <= r2; x++) {
            int yMax = (int)Math.floor(Math.sqrt(r2Square - x*x));
            int yMin = 0;
            if (x < r1) {
                yMin = (int)Math.ceil(Math.sqrt(r1Square - x*x));
            }
            sum += yMax - yMin + 1;
        }
        return sum * 4;
    }
}



이렇게 수정된 코드는 기능적으로는 이전 코드와 동일하지만, 가독성과 계산 효율성이 개선되었습니다.

 

 

엄청 똑똑하다. 프리미엄 바로 지를 뻔 했다.