조건에 맞는 개발자 찾기
https://school.programmers.co.kr/learn/courses/30/lessons/276034
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
이번 쿼리 짜는 건 매우 어려웠다. 사실 남들 푼거 보고 했는데 자존심이 상한다. 하... 일단 최대한 단계별로 분석해보자. 이거는 그나마 쉬운데 다음 거는 진짜 HELL이었다.
DEVELOPERS 테이블
ID | FIRST_NAME | LAST_NAME | 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 | 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 | 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를 써준다.
매우 어렵지만 다음은 더 해맸다
'MYSQL > 프로그래머스 LV02' 카테고리의 다른 글
ROOT 아이템 구하기 (0) | 2025.02.21 |
---|---|
업그레이드 된 아이템 구하기 (0) | 2025.02.17 |
노선별 평균 역 사이 거리 조회하기 (0) | 2025.02.14 |
물고기 종류 별 잡은 수 구하기 (0) | 2025.02.14 |
월별 잡은 물고기 수 구하기 (0) | 2025.02.14 |