본문 바로가기
MYSQL/프로그래머스 LV02

조건에 맞는 개발자 찾기

by 수스리 2025. 2. 17.

조건에 맞는 개발자 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/276034

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

이번 쿼리 짜는 건 매우 어려웠다. 사실 남들 푼거 보고 했는데 자존심이 상한다. 하... 일단 최대한 단계별로 분석해보자. 이거는 그나마 쉬운데 다음 거는 진짜 HELL이었다. 

DEVELOPERS 테이블

ID FIRST_NAME LAST_NAME EMAIL SKILL_CODE
D165 Jerami Edwards jerami_edwards@grepp.co 400
D161 Carsen Garza carsen_garza@grepp.co 2048
D164 Kelly Grant kelly_grant@grepp.co 1024
D163 Luka Cory luka_cory@grepp.co 16384
D162 Cade Cunningham cade_cunningham@grepp.co 8452

SKILLCODES 테이블

NAME CATEGORY CODE
C++ Back End 4
JavaScript Front End 16
Java Back End 128
Python Back End 256
C# Back End 1024
React Front End 2048
Vue Front End 8192
Node.js Back End 16384

일단 딱 봐도 비트연산을 써야 한다는 데 감이 온다. 문제가 어렵다 최대한 차근차근해보자.

 

단계 1.

더보기

SELECT
    DISTINCT(D.ID), D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS D  
JOIN SKILLCODES S ON (D.SKILL_CODE & S.CODE) = S.CODE AND S.NAME IN ("Python", "C#")
ORDER BY D.ID ASC;

결과

더보기
ID FIRST_NAME LAST_NAME EMAIL SKILL_CODE NAME CATEGORY CODE
D161 Carsen Garza carsen_garza@grepp.co 2048 React Front End 2048
D162 Cade Cunningham cade_cunningham@grepp.co 8452 C++ Back End 4
D162 Cade Cunningham cade_cunningham@grepp.co 8452 Python Back End 256
D162 Cade Cunningham cade_cunningham@grepp.co 8452 Vue Front End 8192
D163 Luka Cory luka_cory@grepp.co 16384 Node.js Back End 16384
D164 Kelly Grant kelly_grant@grepp.co 1024 C# Back End 1024
D165 Jerami Edwards jerami_edwards@grepp.co 400 JavaScript Front End 16
D165 Jerami Edwards jerami_edwards@grepp.co 400 Java Back End 128
D165 Jerami Edwards jerami_edwards@grepp.co 400 Python Back End 256

중요한건 JOIN 문이다. 

JOIN SKILLCODES S ON (D.SKILL_CODE & S.CODE) = S.CODE AND S.NAME IN ("Python", "C#")

DEVELOPER의 SKILL_CODE에 있는 번호와 SKILLCODES에 있는 CODE를 &연산 해준다. &연산해서 나오는 결과가 S.CODE면 각 개발자가 가지고 있는 기술을 알 수 있다. 

참고

예를 들어 어떤 개발자의 SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.

 

2단계

더보기

SELECT
    DISTINCT(D.ID), D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS D  
JOIN SKILLCODES S ON (D.SKILL_CODE & S.CODE) = S.CODE AND S.NAME IN ("Python", "C#")
ORDER BY D.ID ASC;

결과

더보기
ID EMAIL FIRST_NAME LAST_NAME
D162 cade_cunningham@grepp.co Cade Cunningham
D164 kelly_grant@grepp.co Kelly Grant
D165 jerami_edwards@grepp.co Jerami Edwards

중요한건 DISTINCT(D.ID) 이 부분. 사실 나머지는 다 맞게 썼는데 저 부분을 안써서 틀렸다

만약 DISTINCT를 쓰지 않으면 파이썬과 C#을 둘다 쓰는 개발자가 나오면 두번 선택되기 때문에 DISTINCT를 써준다.

 

매우 어렵지만 다음은 더 해맸다