프로그래머스/My SQL

언어별 개발자 분류하기

싱싱한복초이 2025. 1. 2. 16:29

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

 

[나의 풀이]

문제에 대한 궁금증:
Front End 스킬과 Python 스킬을 함께 가지면서 C#스킬을 가진 개발자는 어떻게 처리해야 하는가?
궁금증에 대한 답변:
Front End 스킬과  Python 스킬을 가졌다면 A등급 -> 나머지 중에 C# 스킬을 가졌다면 B등급 -> 나머지 중에 Front End 스킬을 가졌다면 C등급

 

WITH FF AS (
    SELECT SUM(CODE) AS CODE
    FROM SKILLCODES
    WHERE CATEGORY = 'Front End'
),
CC AS (
    SELECT CODE
    FROM SKILLCODES
    WHERE NAME = 'C#'
),
PP AS (
    SELECT CODE
    FROM SKILLCODES
    WHERE NAME = 'Python'
),
FIN AS (
SELECT
    CASE
        WHEN SKILL_CODE & (SELECT CODE FROM FF) > 0 
             AND SKILL_CODE & (SELECT CODE FROM PP) > 0 THEN 'A'
        WHEN SKILL_CODE & (SELECT CODE FROM CC) > 0 THEN 'B'
        WHEN SKILL_CODE & (SELECT CODE FROM FF) > 0 THEN 'C'
        ELSE NULL 
    END AS GRADE,
    ID, EMAIL
FROM DEVELOPERS
)

SELECT *
FROM FIN
WHERE GRADE IS NOT NULL
ORDER BY GRADE, ID;

 

[다른 풀이]

 

1)

SELECT
    CASE
     WHEN (SKILL_CODE & (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY LIKE 'FRONT%')) 
          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 SUM(CODE) FROM SKILLCODES WHERE CATEGORY LIKE 'FRONT%') THEN 'C'
    ELSE NULL
    END AS GRADE
,ID, EMAIL
FROM DEVELOPERS
GROUP BY GRADE, ID, EMAIL
HAVING GRADE IS NOT NULL
ORDER BY GRADE, ID

 

2)

WITH main AS (
    SELECT
        d.ID,
        d.EMAIL,
        group_concat(s.NAME) AS NAME,
        group_concat(s.CATEGORY) AS CATEGORY
    FROM DEVELOPERS d
    JOIN SKILLCODES s ON d.SKILL_CODE & s.CODE = s.CODE
    GROUP BY d.ID, d.EMAIL
)
SELECT *
FROM (
    SELECT
        CASE
            WHEN NAME LIKE '%Python%' AND CATEGORY LIKE '%Front End%' THEN 'A'
            WHEN NAME LIKE '%C#%' THEN 'B'
            WHEN CATEGORY LIKE '%Front End%' THEN 'C'
        END AS GRADE,
        ID,
        EMAIL
    FROM main
) A
WHERE GRADE IS NOT NULL
ORDER BY GRADE, ID;

 

GROUP_CONCAT이란?

 

MySQL 및 일부 데이터베이스 시스템(예: SQLite)에서 사용 가능한 집계 함수로, 여러 행의 값을 하나의 문자열로 결합하는 데 사용됩니다.

  • GROUP_CONCAT은 GROUP BY와 함께 사용하여 특정 그룹 내의 여러 행 값을 쉼표 또는 사용자가 지정한 구분자로 연결된 문자열로 반환합니다.
  • 예를 들어, 하나의 개발자가 여러 기술을 보유한 경우, 이 기술들을 하나의 문자열로 결합해 반환합니다.

 

(예시)

 

-참고

https://dakwk.tistory.com/entry/MySQL-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%96%B8%EC%96%B4%EB%B3%84-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%B6%84%EB%A5%98%ED%95%98%EA%B8%B0-LEVEL-4

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/276036 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr언어별 개발자 분류하

dakwk.tistory.com

 

3)

SELECT CASE
WHEN SUM(CASE WHEN a.CATEGORY = 'Front End' THEN 1 ELSE 0 END) > 0 
        AND SUM(CASE WHEN a.NAME = 'Python' THEN 1 ELSE 0 END) > 0 THEN 'A'
WHEN SUM(CASE WHEN a.NAME = 'C#' THEN 1 ELSE 0 END) > 0 THEN 'B'
WHEN SUM(CASE WHEN a.CATEGORY = 'Front End' THEN 1 ELSE 0 END) > 0 THEN 'C' 
END AS GRADE, 
b.ID, b.EMAIL
FROM SKILLCODES AS a LEFT OUTER JOIN DEVELOPERS AS b
ON a.CODE & b.SKILL_CODE
GROUP BY b.ID, b.EMAIL
HAVING GRADE IS NOT null
ORDER BY GRADE, b.ID;