본문 바로가기
MYSQL/프로그래머스 LV04

언어별 개발자 분류하기

by 수스리 2025. 3. 20.

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제

DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다. A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자 B : C# 스킬을 가진 개발자 C : 그 외의 Front End 개발자 GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요. 결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.

 

개인적으로 여태 푼 문제 중 가장 어려웠다. 며칠 간 고민 끝에 다른사람 풀이를 참고했다.

WITH TEMP1 AS (
    SELECT
        SUM(CODE) AS FRONT_CODE
    FROM
        SKILLCODES
    WHERE
        CATEGORY = "Front End"
),
TEMP2 AS (
    SELECT
        CASE
        WHEN (SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 AND
            SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) THEN 'A'
        WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "C#")) THEN 'B'
        WHEN SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 THEN 'C'
        ELSE NULL
        END AS GRADE,
        ID, EMAIL
    FROM
        DEVELOPERS
    ORDER BY
        GRADE, ID
)
SELECT *
FROM TEMP2
WHERE GRADE IS NOT NULL

코드를 차근차근 살펴보자. TEMP1이라는 가상 테이블이다. 

    SELECT
        SUM(CODE) AS FRONT_CODE
    FROM
        SKILLCODES
    WHERE
        CATEGORY = "Front End"

프런트엔드 개발자를 조건으로 해서 모든 코드들의 합을 구한다. 나는 이렇게 생각을 못해봤다. 별 중요한 조건이 아니라고 생각했다. 나는 그레이드를 구하고 FRONT END를 구하면 된다고 생각했는데 이러면 안된다. 저렇게 쿼리를 쓰면 프런트 엔드 기술의 코드를 다 합한다.

    SELECT
        CASE
        WHEN (SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 AND
            SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) THEN 'A'
        WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "C#")) THEN 'B'
        WHEN SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 THEN 'C'
        ELSE NULL
        END AS GRADE,
        ID, EMAIL
    FROM
        DEVELOPERS
    ORDER BY
        GRADE, ID

CASE WHEN 절 구문을 집중해서 보자

CASE
        WHEN (SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 AND
            SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) THEN 'A'
        WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "C#")) THEN 'B'
        WHEN SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 THEN 'C'

(SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) > 0 AND
            SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) THEN 'A' 여기서

SKILL_CODE & (SELECT FRONT_CODE FROM TEMP1) 이 쿼리는 프런트엔드 개발자를 찾는 코드이다.

TEMP1에 있는 테이블은  모두 프런트 엔드 기술의 코드다. 그걸 합 한게 FRONT_CODE이니 이거를 SKILL_CODE  와& 연산 해서 0이상이면 프런트엔드 코드가 나오고 0이면 백엔드 코드가 나온다. 

SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = "Python")) 이 코드는 엔드 연산자를 하고 이름이 파이썬인 코드를 찾는 다.
나머지도 원리가 같은 쿼리를 쓴다.