홍동이의 성장일기

[LeetCode] 1934. Confirmation Rate (특정 조건에 부합하는 확률 구하기) 본문

Tool/SQL 코딩테스트 풀이

[LeetCode] 1934. Confirmation Rate (특정 조건에 부합하는 확률 구하기)

홍동2 2024. 3. 18. 15:47

🔎 문제

 

사용자의 확인율은 '확인'된 메시지 수를 전체 확인 요청 메시지 수로 나눈 값입니다. 확인 메시지를 요청하지 않은 사용자의 확인율은 0입니다. 확인율을 소수점 두 자리로 반올림합니다. 솔루션을 작성하여 각 사용자의 확인률을 찾습니다.

 

📍 문제 링크: https://leetcode.com/problems/confirmation-rate/description/

 

💡 문제 풀이

 

# 풀이 1번
WITH cte_all AS
(
    SELECT s.user_id, c.action
        , CASE WHEN action = 'confirmed' THEN 1
                ELSE 0
            END as 'cou'
    FROM signups as s left join confirmations as c
        on s.user_id = c.user_id
)
SELECT user_id
    , ROUND(SUM(cou) / COUNT(*), 2) as 'confirmation_rate'
FROM cte_all
GROUP BY 1

 

1️⃣ user_id = 6의 경우 signups 테이블에는 데이터가 있지만 confirmations에는 없다.

따라서 LEFT JOIN을 사용해서 두 테이블을 조인해주었다.

SELECT *
FROM signups as s left join confirmations as c
    on s.user_id = c.user_id

LEFT JOIN 한 모습

 

2️⃣ 여러가지 코딩테스트를 풀어보면서 보통 이렇게 특정 조건이 있는 경우는 CASE문을 사용해서 해결하는 경우를 많이 보았다. 그래서 이번에도 action이 confirmed인 경우는 1 그렇지 않은 경우는 0을 지정해주었다.

SELECT s.user_id, c.action
    , CASE WHEN action = 'confirmed' THEN 1
            ELSE 0
        END as 'cou'
FROM signups as s left join confirmations as c
    on s.user_id = c.user_id

action = 'confirmed'인 경우는 1, 그렇지 않은 경우는 0이 지정되었다.

 

3️⃣ user_id를 기준으로 group by를 해주고, 전체 행을 count한 것에서 cou를 나눠주면 confirmation_rate를 구할 수 있다.


문제를 풀고 solutions를 살펴보니 단 두 줄로 이 문제를 풀 수 있었다는 것을 알 수 있었다🫢

 

 

조건이 confirmed인지, 아닌지 단 두가지이므로 case문 대신 IF를 사용할 수 있었고, 임의의 테이블을 하나 더 만들지 않아도 해결이 가능했다. 해당 쿼리를 바탕으로 내 쿼리를 조금 더 간단하게 수정해보았다.

 

# Solution 방법 1번에 적용하기 (CASE 대신 IF를 사용함, cte를 만들 필요가 없었음!)
SELECT s.user_id
    , ROUND(SUM(IF(c.action='confirmed',1,0))/COUNT(*), 2) as 'confirmation_rate'
FROM signups as s left join confirmations as c
    on s.user_id = c.user_id
GROUP BY s.user_id

 

위 풀이에서는 avg함수를 사용하여 더욱 간단하게 문제를 해결했다.

다음에 비슷한 문제가 나오면 같은 방법으로 풀어봐야겠다. 

 

 

 

728x90
Comments