노아

[프로그래머스] 언어별 개발자 분류하기 본문

알고리즘/SQL

[프로그래머스] 언어별 개발자 분류하기

Noaahhh 2024. 9. 21. 11:08

 

Question

 

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

 

Pseudocode

 

  1. 서브쿼리로 등급을 매기는 GRADE CTE(공통 테이블 표현식)를 정의:
    • 각 개발자(ID)의 SKILL_CODE를 비트 연산을 통해 여러 조건을 체크합니다.
    • 먼저, Python 기술을 가지고 있고, 동시에 Front End 기술을 가진 경우를 확인하여 이 개발자에게 'A' 등급을 부여합니다.
    • C# 기술을 가진 경우에는 'B' 등급을 부여합니다.
    • Front End 기술만 가진 경우는 'C' 등급을 부여합니다.
    • 그 외에는 'D' 등급을 부여합니다.
  2. 메인 쿼리:
    • 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