오늘은 머리털 나고 처음 접해보는 비트 연산 SQL 문제
4가지 풀이법을 가져왔다.
1. 출처
https://school.programmers.co.kr/learn/courses/30/lessons/276035
- 개발자 중에 프론트엔드 개발자를 찾을 것
- 개발자의 스킬코드는 2진수로 표현했을 때 bit로 구분될 수 있도록 2의 제곱수로 구성됨
- 예를 들어 신산하의 스킬 코드가 400 ( = 110010000) 이면, 자바스크립트 코드 256 ( = 100000000)와 자바 128( = 10000000)와 스프링16( = 10000)의 스킬을 전부 포함하고 있는 것
2. 설계와 4가지 정답
문제에서 2진수로 표현했을 때 bit로 구분될 수 있도록 2의 제곱수로 구성되어있다고 했다.
이게 무슨 뜻인지만 해석하면 바로 문제는 풀린다.
2-1) 위치 표현
400 ( = 110010000)이 있다고 가정하자
- 자바스크립트 코드 256 ( = 100000000)
- 자바 코드 128( = 10000000)
- 스프링 코드 16( = 10000)
각 색깔별로 표현되는 것을 유심히 보면 각 언어의 코드가 개발자의 코드에서 표현되는 위치가 다르다는 것을 알 수 있다.
- 16 = 2^4 = 5번째 자리 (0부터 시작하니까)
- 128 = 2^7 = 8번째 자리 (0부터 시작하니까)
- 128 = 2^8 = 9번째 자리 (0부터 시작하니까)
2-2) 비트 연산
비트연산은 크게 &와 |연산이 있다.
- &연산
비트로 두 수를 표현했을 때 각 자리가 모두 1인 경우에만 1(true)를 도출한다.
0 | 1 | 0 | 1 |
0 | 0 | 1 | 1 |
0 | 0 | 0 | 1 |
- | 연산
비트로 두 수를 표현했을 때 각 자리가 모두 0인 경우에만 1(false)를 도출한다.
0 | 1 | 0 | 1 |
0 | 0 | 1 | 1 |
0 | 1 | 1 | 1 |
2-3) 규칙과 4가지 정답
2가지 규칙을 찾을 수 있다.
규칙 1) 자바스크립트 코드(256) = 자바스크립트 코드(256) & 산하의 스킬 코드(400) = 100000000 & 110010000 = 100000000
규칙 2) 산하의 스킬 코드(400) = 자바스크립트 코드(256) | 산하의 스킬 코드(400) = 100000000 | 110010000 = 110010000
이 규칙을 4가지 방법으로 SQL 코드를 작성할 수 있다.
방법1 ) FROM 절에 규칙 1번 사용
#1. & 이용
SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME
FROM DEVELOPERS d JOIN SKILLCODES s ON s.CODE = d.SKILL_CODE&s.CODE
WHERE s.CATEGORY LIKE 'Front End'
ORDER BY d.ID;
방법2 ) FROM 절에 규칙 2번 사용
#2. | 이용
SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME
FROM DEVELOPERS d JOIN SKILLCODES s ON d.SKILL_CODE = d.SKILL_CODE|s.CODE
WHERE s.CATEGORY LIKE 'Front End'
ORDER BY d.ID;
방법3 ) WHERE 절에 규칙 1번 사용
#3. & 이용
SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME
FROM DEVELOPERS d JOIN SKILLCODES s
WHERE s.CODE = d.SKILL_CODE&s.CODE AND s.CATEGORY LIKE 'Front End'
ORDER BY d.ID;
방법 4) WHERE 절에 규칙 2번 사용
#3. & 이용
SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME
FROM DEVELOPERS d JOIN SKILLCODES s
WHERE d.SKILL_CODE = d.SKILL_CODE|s.CODE AND s.CATEGORY LIKE 'Front End'
ORDER BY d.ID;
DISTICT로 ID 중복을 없애주지 않으면, ID 당 여러 개의 보유 스킬이 붙어 여러 ID가 뜨기 때문에 꼭 써줘야 한다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 상품을 구매한 회원 비율 구하기 [#SQL] (1) | 2024.03.11 |
---|---|
[프로그래머스] lv2. 땅따먹기 [#DP] (0) | 2024.03.08 |
[프로그래머스] 그룹별 조건에 맞는 식당 목록 출력하기 [#SQL] (0) | 2024.03.06 |
[JOIN] SQL 고득점 키트 문제 풀이 모음 (0) | 2024.01.22 |
[프로그래머스] lv3. PCCP 기출문제 3번 / 아날로그 시계 [#구현] (0) | 2023.12.14 |