알아야 할 것
비트연산자
- 다른 프로그래밍 언어에서 사용하는 방식과 같다.
- 추가적으로 `b'10001'` 과 같이 `b`를 붙여 2진수 형태의 문자열을 비트연산할 수 있다.
- `b'1001' & b'001' = 1`
CASE WHEN 문법
`if - else if - else`방식으로 사용할 수도, `switch - case`방식으로 작성할 수도 있다.
if - else if - else
방식
CASE
WHEN (조건1) THEN (조건에 맞을 경우 대입할 값1)
WHEN (조건2) THEN (조건에 맞을 경우 대입할 값2)
ELSE (위 조건 모두에 해당하지 않을 경우 대입할 값3)
END
기본 적으로 위와 같이 사용한다. 조건에는 서브 쿼리가 올 수도 있다.
switch - case
방식
CASE 컬럼
WHEN (비교하려는 값1) THEN (조건에 맞을 경우 대입할 값1)
WHEN (비교하려는 값2) THEN (조건에 맞을 경우 대입할 값2)
ELSE (위 조건 모두에 해당하지 않을 경우 대입할 값3)
END
CASE에 특정 컬럼의 값을 넣어 비교한다는 점이 다르다.
위 두 개를 알고 있다면 크게 어렵지 않게 문제를 풀 수 있다.
특정 기술을 가진 개발자 찾기, 개발자 등급 부여하기 두 부분으로 나눌 수 있다.
여기서 핵심은 프론트엔드 개발자를 찾는 부분인데 문제에서 각 bit는 구분될 수 있도록 2의 제곱수로 구성되어 있다라고 했다. 따라서, 각 비트는 배타적이고 공유되지 않는다.
그렇기 때문에 프론트엔드에 해당하는 기술들을 모두 더한 뒤 각 개발자의 보유 스킬과 &
연산 했을 때 하나라도 같은 부분이 있다면 해당 개발자는 프론트엔드 기술을 보유한 개발자다.
이를 코드로 바꾸면 다음과 같다.
SKILL_CODE & (SELECT SUM(CODE) FROM SKILLCODES
WHERE CATEGORY LIKE 'FRONT%')
이제 여기서 파이썬을 사용할 수 있는지 추가로 확인해주면 된다.
위와 같이 각 조건에 해당 하는 등급을 CASE WHEN으로 부여하면 다음과 같다.
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
각 조건에 해당하지 않는 개발자들은 NULL로 두고 이후 NULL인 개발자들을 제외하면 된다.근데 이 문제가 GROUP BY에 해당하는 건 단순히 HAVING 절을 쓰기 위함인가 싶다.
정답
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
'Problem Solving > 프로그래머스' 카테고리의 다른 글
프로그래머스 : 전화번호 목록 Java (0) | 2024.01.22 |
---|