언어별 개발자 분류하기
프로그래머스 GROUP by Lv 4
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
SKILLCODES Table
NAME | TYPE | UNIQUE | NULLABLE |
NAME | VARCHAR(N) | Y | N |
CATEGORY | VARCHAR(N) | N | N |
CODE | INTEGER | Y | N |
DEVELOPERS Table
NAME | TYPE | UNIQUE | NULLABLE |
ID | VARCHAR(N) | Y | N |
FIRST_NAME | VARCHAR(N) | N | Y |
LAST_NAME | INTEGER | N | Y |
VARCHAR(N) | Y | N | |
SKILL_CODE | INTEGER | N | N |
다음과 같이 테이블이 주어지고, SKILLCODES 의 CODE 는 2진수로 바꿨을 때 1000, 10, 100000 으로 나올 수 있도록 한 데이터들이었다. DEVELOPERS 의 SKILL_CODE은 해당 코드들의 합이어서, 2진수로 표현하면 10110 이런식으로 나타낼 수 있었다.
sql에서도 일반 언어와 같이 비트연산이 가능했든데, 이 문제 풀이를 위해선 조건에 맞는 code 를 모두 더한뒤 그것과 skillcode와 and 연산을 해 풀이할 수 있었다.
Query
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
;
후기
국민은행 코테를 준비중이라 평소에 안하던 sql을 부랴부랴 하고 있는데, 생각보다 기능이 많고 어지간하면 쿼리로 다 처리할 수 있을 것 같다는 생각을 하고있다.
조건을 달 때 주로 CASE ~ END 구문을 쓰는데, 아직 익숙치 않아 계속 버벅이는 것 같다.
프로그래머스의 Group by 파트만 익숙해져도 문제는 풀 정도 된다는데, 아직 갈길이 멀다..