[프로그래머스][MySQL] Lv. 4 FrontEnd 개발자 찾기
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/276035
2진수를 이용하는 문제이다.
문제의 조건은 간단하다.
- DEVELOPERS 테이블에서 Front End 스킬을 가진 개발자의 정보 조회
- 개발자의 ID, 이메일, 이름, 성을 조회
- ID를 기준으로 오름차순
내 풀이
SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME
FROM DEVELOPERS d INNER JOIN SKILLCODES s
ON d.SKILL_CODE = d.SKILL_CODE | s.CODE
WHERE s.CATEGORY = 'Front End'
ORDER BY d.ID;
주의할 점은 2가지가 있다.
1. 2진수 연산
2. 중복 ID 제거 : 중복을 제거하지 않으면 한 ID당 여러 개의 보유 스킬이 붙어 여러 ID가 뜨게 된다.
개념
2진수는 항상 어려운 것 같다!
문제에서 SKILL_CODE가 400이면, CODE는 256, 128, 16에 해당된다.
즉,
10진수 | 2진수 | 자리 |
400 | 110010000 | |
256 | 100000000 | 9번째 자리에 1 (2^8=256) |
128 | 10000000 | 8번째 자리에 1 (2^7=128) |
16 | 10000 | 5번째 자리에 1 (2^4=16) |
이 되는 것이다.
즉, 400이라는 숫자는 256 + 128 + 16이 된다.
따라서, 400은 256, 128, 16을 포함하는 것이다!
2진수에서의 &와 |
이제, 이걸 비교하기 위해 & 연산과 | 연산을 이용해보자.
& 연산은 AND를 의미하며, | 연산은 OR을 의미한다.
<& 연산자의 경우>
: 모두 1일 경우에만 1(true)을 반환한다.
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
<| 연산자의 경우>
: 하나라도 1이 있으면 1(true)을 반환한다.
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
과 같이 되는 것을 알 수 있다.
따라서, 이를 문제에 적용해보자.
1) & 연산자 사용
ex) 400 & 256 = 110010000 & 100000000 = 100000000 = 256
SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME
FROM DEVELOPERS d INNER JOIN SKILLCODES s
-- 400 & 256 = 110010000 & 100000000 = 100000000 = 256
ON s.CODE = d.SKILL_CODE & s.CODE
WHERE s.CATEGORY = 'Front End'
ORDER BY d.ID;
2) | 연산자 사용
ex) 400 | 256 = 110010000 | 100000000 = 110010000 = 400
SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME
FROM DEVELOPERS d INNER JOIN SKILLCODES s
-- 400 | 256 = 110010000 | 100000000 = 110010000 = 400
ON d.SKILL_CODE = d.SKILL_CODE | s.CODE
WHERE s.CATEGORY = 'Front End'
ORDER BY d.ID;
와 같이 2가지 방법을 사용해서 문제를 풀 수 있다.