본문 바로가기
🗄️ DB_이야기/# ⚡SQL

🚀[SQL 알고리즘 문제 풀이] Programmers : 언어별 개발자 분류하기(GROUP BY)

by gwon_s 2026. 4. 20.

👇 언어별 개발자 분류하기

 

프로그래머스

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를 기준으로 오름차순 정렬해 주세요.

 

예시 문제 데이터

[SKILLCODES]

NAME CATEGORY CODE
C++ Back End 4
JavaScript Front End 16
Java Back End 128
Python Back End 256
C# Back End 1024
React Front End 2048
Vue Front End 8192
Node.js Back End 16384

 

[DEVELOPERS]

ID FIRST_NAME LAST_NAME EMAIL SKILL_CODE
D165 Jerami Edwards jerami_edwards@grepp.co 400
D161 Carsen Garza carsen_garza@grepp.co 2048
D164 Kelly Grant kelly_grant@grepp.co 1024
D163 Luka Cory luka_cory@grepp.co 16384
D162 Cade Cunningham cade_cunningham@grepp.co 8452

 


⚡SQL Query

내가 작성한 답(MySQL & Oracle)

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

 

또는

WITH FRONT_END AS (
    -- 프론트엔드 카테고리에 해당하는 모든 코드를 합산 (비트 합)
    SELECT SUM(CODE) AS BIT_SUM
    FROM SKILLCODES
    WHERE CATEGORY = 'Front End'
),
GRADES AS (
    SELECT 
        CASE 
            -- A: Front End 스킬이 하나라도 있고(&) AND Python 스킬(256)이 있는 경우
            WHEN (SKILL_CODE & (SELECT BIT_SUM FROM FRONT_END)) 
                 AND (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) THEN 'A'
            -- B: C# 스킬(1024)이 있는 경우
            WHEN (SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')) THEN 'B'
            -- C: 그 외에 Front End 스킬이 하나라도 있는 경우
            WHEN (SKILL_CODE & (SELECT BIT_SUM FROM FRONT_END)) THEN 'C'
        END AS GRADE,
        ID,
        EMAIL
    FROM DEVELOPERS
)
-- GRADE가 없는 사람은 제외하고 출력
SELECT GRADE, ID, EMAIL
FROM GRADES
WHERE GRADE IS NOT NULL
ORDER BY GRADE ASC, ID ASC;

🔎 풀이 설명

1. WITH절(CTE) 및 비트 마스크 활용

  • Fron End 스킬들을 OR로 체크하는 대신 SUM()을 활용하여 하나의 코드로 만들어 활용합니다.

2. CASE 문 활용

  • CASE 문을 사용하여 개발자가 가진 2진수의 스킬코드들을 AND 연산을 통해 확인합니다.

3. 인라인 뷰를 통한 NULL 처리

  • GRADE 값에 NULL을 제거하기 위해서 가상쿼리를 사용해 WHERE절에서 NULL값을 처리합니다. 

4. 정렬


💡인사이트

1.  CASE 문의 연산 횟수 

  • 현재 작성한 CASE문SELECT ... 를 여러번 호출하기 때문에 비트연산으로 인한 Full Table Scan대용량 테이블이라면 성능 저하의 위험이 있습니다.