코딩테스트

[26.03.31 코테/회고(MySQL)]-언어별 개발자 분류하기

지니248 2026. 3. 31. 15:36

Lv4. 언어별 개발자 분류하기 (MySQL)

링크: https://school.programmers.co.kr/learn/courses/30/lessons/276036

 

내가 작성한 코드

SELECT * FROM (
    SELECT 
        CASE 
            -- A : Front End 와 Python 스킬을 동시에 가짐
            WHEN (SKILL_CODE & (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = 'Front End')) > 0 
             AND (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) > 0 THEN 'A'
            
            -- B : C# 스킬을 가짐
            WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')) > 0 THEN 'B'
            
            -- C : 그 외의 Front End 개발자
            WHEN (SKILL_CODE & (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = 'Front End')) > 0 THEN 'C' 
        END AS GRADE,
        ID,
        EMAIL
    FROM DEVELOPERS
) AS RESULT
WHERE GRADE IS NOT NULL -- GRADE가 존재하는 개발자만 조회하기 위함
ORDER BY GRADE, ID;

 

새로 배운 코드

WITH SKILLS AS (
    SELECT 
        (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = 'Front End') AS FE_SUM,
        (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python') AS PY_CODE,
        (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#') AS CS_CODE
)
SELECT * FROM (
    SELECT 
        CASE 
            WHEN (SKILL_CODE & FE_SUM) > 0 AND (SKILL_CODE & PY_CODE) > 0 THEN 'A'
            WHEN (SKILL_CODE & CS_CODE) > 0 THEN 'B'
            WHEN (SKILL_CODE & FE_SUM) > 0 THEN 'C'
        END AS GRADE,
        ID,
        EMAIL
    FROM DEVELOPERS, SKILLS
) AS RESULT
WHERE GRADE IS NOT NULL
ORDER BY GRADE, ID;

 

문제 회고

- 문제를 풀다가 막히는 부분들이 생겨 Gemini와 다른 분들이 공유하신 코드들을 보고 해결하였다

1. Front End 찾는 부분에서 SUM을 한 이유

- Front End의 스킬들이 여러개인데, 이것을 OR 조건으로 하나하나 작성하면 코드가 길어진다

- 따라서 SUM(CODE)를 사용해 Front End 카테고리의 모든 점수를 하나로 합쳐

- 한 번의 비트 연산으로 해당 카테고리의 스킬 중 하나라도 보유하고 있는지 판단한다

2. GROUP BY를 사용하지 않고 서브쿼리로 묶은 이유

- WHERE절을 실행할 때 SELECT 절에서 정의한 별칭을 인식하지 못하므로 전체를 서브쿼리로 감싸줌으로써

- 바깥쪽 WHERE절에서 컬럼을 자유롭게 필터링 가능하다

3. 느낀점

- CASE절 안에서 서브쿼리를 활용한 복잡한 연산이 가능하다는 것을 배웠다