on my way

[프로그래머스 코딩테스트 연습 SQL] 특정한 조건을 만족하는 물고기별 수와 최대 길이 구하기 (MySQL) | COALESCE 본문

algorithm/SQL

[프로그래머스 코딩테스트 연습 SQL] 특정한 조건을 만족하는 물고기별 수와 최대 길이 구하기 (MySQL) | COALESCE

wingbeat 2024. 9. 16. 03:26
반응형

내가 처음 푼 코드

SELECT COUNT(*) AS FISH_COUNT, MAX(LENGTH) AS MAX_LENGTH, FISH_TYPE
FROM FISH_INFO
WHERE FISH_TYPE IN (SELECT FISH_TYPE
FROM (SELECT FISH_TYPE, CASE WHEN ISNULL(LENGTH) THEN 10 ELSE LENGTH END AS LENGTH
FROM FISH_INFO) AS T
GROUP BY FISH_TYPE
HAVING AVG(LENGTH) >= 33)
GROUP BY FISH_TYPE
ORDER BY FISH_TYPE

평가

  1. 정확성 (5점 만점 중 3.5점)
    • 주어진 문제를 해결하는 데 있어서 기본적인 로직은 잘 잡았고, COUNT, MAX, GROUP BY 등의 함수도 올바르게 사용했다.
    • 그러나 WHERE FISH_TYPE IN 조건이 너무 복잡하게 작성되었고, HAVING 절 내에서 AVG(LENGTH)를 구하는 부분에서 리팩토링이 가능하다.
    • 또한, ISNULL(LENGTH) 대신 COALESCE 함수가 더 적합한 상황이다.
  2. 효율성 (5점 만점 중 3점)
    • 문제 해결 방식은 맞지만, 코드가 중복 계산을 포함하고 있어서 비효율적이다. 예를 들어, 서브쿼리 내에서 CASELENGTH가 10 이하인 값을 처리하는 부분은 메인 쿼리로도 해결할 수 있다.
    • 서브쿼리를 줄이면 쿼리의 속도가 향상될 수 있다.
  3. 가독성 (5점 만점 중 3점)
    • 쿼리의 복잡성 때문에 가독성이 떨어진다. 서브쿼리를 줄이거나 간단한 조인으로 바꾼다면 가독성이 높아질 수 있다.

해설

  1. 쿼리의 구조
    • 사용된 FISH_TYPE IN 구문은 평균 길이를 계산하고 조건을 만족하는 경우에만 필터링하는 방식이다.
    • 또한 ISNULLLENGTH가 10 이하인 경우를 처리했으나, 이는 COALESCE 함수가 더 적절하다. COALESCE는 첫 번째로 NULL이 아닌 값을 반환하는 함수이기 때문에 좀 더 직관적이다.
    • 서브쿼리를 줄일 수 있다. 전체적으로 조건을 조금 더 간결하게 작성하는 방법이 있다.

리팩토링

SELECT COUNT(*) AS FISH_COUNT, MAX(COALESCE(LENGTH, 10)) AS MAX_LENGTH, FISH_TYPE
FROM FISH_INFO
GROUP BY FISH_TYPE
HAVING AVG(COALESCE(LENGTH, 10)) >= 33
ORDER BY FISH_TYPE;

리팩토링 설명

  1. COALESCE 사용: ISNULL 대신 COALESCE(LENGTH, 10)을 사용하여 LENGTH가 NULL인 경우를 처리했다. 이 함수는 NULL이 아닌 첫 번째 값을 반환한다.
  2. 서브쿼리 제거: FISH_TYPE IN 구문을 제거하고, 메인 쿼리 내에서 바로 평균 길이를 필터링할 수 있도록 HAVING AVG(COALESCE(LENGTH, 10)) >= 33 구문을 사용했다.
  3. 가독성 개선: 서브쿼리와 복잡한 조건을 간단하게 정리하여 가독성을 높였다.

리팩토링한 코드로는 불필요한 계산과 복잡한 서브쿼리를 줄이면서 동일한 결과를 얻을 수 있게 했다.

반응형