노아
[프로그래머스] 언어별 개발자 분류하기 본문
Question
DEVELOPERS 테이블에서 GRADE별 개발자의 정보를 조회하려 합니다. GRADE는 다음과 같이 정해집니다.
A : Front End 스킬과 Python 스킬을 함께 가지고 있는 개발자
B : C# 스킬을 가진 개발자
C : 그 외의 Front End 개발자
GRADE가 존재하는 개발자의 GRADE, ID, EMAIL을 조회하는 SQL 문을 작성해 주세요.
결과는 GRADE와 ID를 기준으로 오름차순 정렬해 주세요.
Pseudocode
- 서브쿼리로 등급을 매기는 GRADE CTE(공통 테이블 표현식)를 정의:
- 각 개발자(ID)의 SKILL_CODE를 비트 연산을 통해 여러 조건을 체크합니다.
- 먼저, Python 기술을 가지고 있고, 동시에 Front End 기술을 가진 경우를 확인하여 이 개발자에게 'A' 등급을 부여합니다.
- C# 기술을 가진 경우에는 'B' 등급을 부여합니다.
- Front End 기술만 가진 경우는 'C' 등급을 부여합니다.
- 그 외에는 'D' 등급을 부여합니다.
- 메인 쿼리:
- GRADE라는 CTE와 DEVELOPERS 테이블을 조인하여 GRADE에 따라 개발자의 등급과 이메일을 선택합니다.
- GRADE가 'D'가 아닌 경우만 결과로 출력하며, 등급과 ID를 기준으로 정렬합니다.
주요 조건 및 비트 연산:
- SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python') != 0: 해당 개발자가 Python 기술을 보유했는지 확인.
- SKILL_CODE & CODE != 0 AND CATEGORY = 'Front End': 해당 개발자가 Front End 기술을 보유했는지 확인.
- SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#') >= 1: 해당 개발자가 C# 기술을 보유했는지 확인.
Code
WITH GRADE AS (
SELECT ID,
CASE
WHEN SKILL_CODE & (
SELECT CODE
FROM SKILLCODES
where name = 'Python') != 0
AND
(SELECT COUNT(*)
FROM SKILLCODES
WHERE SKILL_CODE & CODE != 0
and
CATEGORY = 'Front End') >= 1 THEN 'A'
WHEN SKILL_CODE & (
SELECT CODE
FROM SKILLCODES
WHERE NAME = 'C#') >= 1 THEN 'B'
WHEN (SELECT COUNT(*)
FROM SKILLCODES
WHERE SKILL_CODE & CODE != 0
AND
CATEGORY = 'Front End') >= 1 THEN 'C'
ELSE 'D'
END GRADE
FROM DEVELOPERS
)
SELECT G.GRADE, G.ID, D.EMAIL
FROM GRADE G JOIN DEVELOPERS D
ON G.ID = D.ID
WHERE G.GRADE != 'D'
ORDER BY 1, 2
'알고리즘 > SQL' 카테고리의 다른 글
[프로그래머스] 멸종위기의 대장균 찾기도움말 (0) | 2024.09.21 |
---|---|
[프로그래머스] 특정 형질을 가지는 대장균 찾기 (0) | 2024.09.20 |
[프로그래머스] 부모의 형질을 모두 가지는 대장균 찾기 (0) | 2024.09.20 |
[프로그래머스] 상품을 구매한 회원 비율 구하기 (0) | 2024.09.20 |
[프로그래머스] FrontEnd 개발자 찾기 (0) | 2024.09.20 |