👇 언어별 개발자 분류하기
프로그래머스
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 | 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과 대용량 테이블이라면 성능 저하의 위험이 있습니다.
'🗄️ DB_이야기 > # ⚡SQL' 카테고리의 다른 글
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(JOIN) (1) | 2026.04.23 |
|---|---|
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기(GROUP BY) (0) | 2026.04.20 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 연도별 대장균 크기의 편차 구하기(MAX) (0) | 2026.04.19 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 물고기 종류 별 대어 찾기(MAX) (1) | 2026.04.19 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 가격이 제일 비싼 식품의 정보 출력하기(MAX) (0) | 2026.04.19 |