반응형
비트 논리 연산을 알면 풀고 모르면 못 풂
프로그래머스 Lv.4 '언어별 개발자 분류하기' SQL 코드 및 풀이
조건파악
SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.
접근
비트 논리 연산자 &를 이용해 두 수를 비교할 경우 일치하는 비트가 존재할 경우 True가 나온다. 이를 이용해 JOIN하자.
구현
WITH J AS (
SELECT
ID,
EMAIL,
CASE -- 조건에 맞게 SCORE를 기록
WHEN COUNT(CASE WHEN CATEGORY = 'Front End' THEN 1 END) > 0 AND
COUNT(CASE WHEN NAME = 'Python' THEN 1 END) > 0
THEN 3
WHEN COUNT(CASE WHEN NAME = 'C#' THEN 1 END) > 0 THEN 2
WHEN COUNT(CASE WHEN CATEGORY = 'Front End' THEN 1 END) > 0 THEN 1
END AS SCORE
FROM
DEVELOPERS AS D
JOIN -- 비트 논리 연산을 조건으로 JOIN
SKILLCODES AS S ON D.SKILL_CODE & S.CODE
GROUP BY
ID,EMAIL
HAVING
SCORE > 0
)
SELECT
CASE
WHEN SCORE = 3 THEN 'A'
WHEN SCORE = 2 THEN 'B'
WHEN SCORE = 1 THEN 'C'
END AS GRADE,
ID,
EMAIL
FROM
J
ORDER BY
1,2
반응형