TIL-sparta

LeetCode) 1211. Queries Quality and Percentage 풀이

Megadr0ne 2024. 7. 28. 05:41

 

학습 키워드: 키워드1, 키워드2, ..., 키워드n

 

1211. Queries Quality and Percentage

1) 문제 설명 요약 (원문은 링크 참고):

https://leetcode.com/problems/queries-quality-and-percentage/description/

 요약: 쿼리의 이름과 결과, position 값과 rating 값을 담은 Queries 테이블에서 쿼리의 quality와 poor_query_percentage를 계산하는 문제다. quality는 쿼리의 rating / position 값의 평균이며, poor_query_quality는 rating 값이 3 미만인 쿼리 수의 비율이다.

 조건: query_name은 중복이 가능하며, quality와 poor_query_percentage 값은 소수점 두 자리 까지만 출력한다.

 

2) 풀이:

 오랜만에 풀려고 하니 감이 전혀 안와서 CTE로 범벅을 만들다가 결국 다른 답변을 참고하여 풀게 됐다. 일단 짚고 넘어가야 할 부분은 문제에 명시되어있지 않은 숨은 조건(=문제 오류)인데, query_name 값이 NULL인 row가 존재한다는 점이다. 쿼리의 where 구문에 query_name IS NOT NULL 을 추가해줘야만 정답 처리된다.

 

 구해야하는 quality와 poor_query_percentage 컬럼은 모두 query_name에 기반하는 정보이기 때문에 GROUP BY 구문으로 쿼리 결과를 query_name으로 묶어줘야 한다. 첫 번째 요구사항인 quality의 경우 동일한 query_name을 가진 row들의 rating / position 값의 평균을 구하면 되는데, 이는 AVG 함수를 이용하면 쉽게 구할 수 있다. 두 번째 요구사항인 poor_query_percentage는 CTE로 풀려고 할 때는 COUNT를 이용하려고 해서 살짝 복잡하게 느껴졌던 부분인데, 알고보니 AVG와 IF를 조합하면 쉽게 풀 수 있는 문제였다. 각 row의 rating 값이 3미만인 경우 1, 이상인 경우 0으로 계산하여 평균을 내고 100을 곱해주면 끝이다. 이를 MySQL 쿼리로 표현하면 다음과 같다.

SELECT 
    query_name,
    ROUND(AVG(rating / position), 2) AS quality,
    ROUND(AVG(IF(rating < 3, 1, 0)) * 100, 2) AS poor_query_percentage
FROM Queries
WHERE query_name IS NOT NULL
GROUP BY query_name;

 

 

3) 기타 사항:

 CTE를 익힌 후 부터 모든 쿼리 문제를 무턱대고 CTE로 풀려고 하는 습관이 생겼는데, 단순하게 풀 수 있는 문제를 복잡하게 만드는 경향이 있어서 앞으로는 Group Function만을 이용한 풀이가 가능한지 여부를 우선적으로 판단하도록 해야겠다.

728x90