SELECT
문제풀이
A. 비트연산 사용
SELECT DISTINCT A.ID, A.EMAIL, A.FIRST_NAME, A.LAST_NAME FROM DEVELOPERS AS A
LEFT JOIN SKILLCODES AS B ON (A.SKILL_CODE & B.CODE) = B.CODE
WHERE B.NAME IN ('Python', 'C#')
ORDER BY A.ID ASC
문제를 풀면서 처음 써본 비트연산.
해당 코드는 JOIN 과정 중 조건에서 A.SKILL_CODE 와 B.CODE 의 값을 비트로 치환 후 비교한다
예를들어 SKILL_CODE에서 400(1_1001_0000)은 256(1_0000_0000) , 128(1000_0000), 16(1_0000)으로
이루어져 있어 B.CODE의 PYTHON, JAVASCRIPT, JAVA을 포함한다.
B.CODE와 비트연산시 저 3개의 비트(B.CODE)에서 TRUE이므로 저 3개를 가진 B.NAME을 반환한다...
이정도의 개념인데
1. (A.SKILL_CODE & B.CODE) = B.CODE와
2. A.SKILL_CODE & B.CODE 결과값이 같게 나왔다
이 부분에 대해서 좀 더 찾아봤다 요약하자면
1번은 특정 기술이 정확히 포함된 경우
2번은 특정 기술을 하나라도 포함한 경우 였다.
문제에서 모든 B.CODE들은 겹치지가 않아 해당문제에서는 문제될 일이 없다고 생각이 드는데 만약에 문제에서
A = 10(2) , B=11(3) , JAVA =01(1), C=10(2) , C++ = 11(3) 라고한다면
2번을 했을경우 A는 C, B는 JAVA, C, C++을 가지고 있게되고
1번은 A는 C를 가지지만 B는 C++ 만을 가지고 있게된다
1. (A.SKILL_CODE & B.CODE) = B.CODE → A=C , B= C++
2. A.SKILL_CODE & B.CODE → A=C , B= C++, JAVA, C
이 정도의 차이인데 문제 예시에서는 그런경우는 없으니 두 결과값이 같다고 나온다
그리고 비트연산을 했을경우 행이 중복으로 출력이 되는데
문제에서는 기술을 가진 개발자의 정보기 때문에 중복해서 결과를 뽑아낼 필요는 없기 때문에 DISTINCT를 사용하여 출력한다. (해당 문제의 예시는 DISTINCT 를 안써도 풀리지만 테스트케이스에서 실패라고 뜸...)
'필기ㆍ코테 공부 > SQL' 카테고리의 다른 글
[프로그래머스/MYSQL] 노선별 평균 역 사이 거리 조회하기 (1) | 2025.02.01 |
---|---|
[프로그래머스/MYSQL] 입양 시각 구하기(2) (0) | 2025.01.28 |
[프로그래머스/MYSQL] 업그레이드 된 아이템 구하기 (0) | 2025.01.25 |
[프로그래머스/MYSQL] 오프라인/온라인 판매 데이터 통합하기 (2) | 2025.01.16 |
[프로그래머스/MYSQL] 분기별 분화된 대장균의 개체 수 구하기 (2) | 2025.01.15 |