■ 문제 URL
■ 문제 풀기
SQL을 배운지 얼마되지 않아 코드가 길다. 그리고, 비트 연산자 쪽은 간신히 이해는 했는데 SQL 에서 어떻게 써야할지 모르겠다. CTE 문에서 bitwise 코드는 아래 블로그의 코드를 참조했다.
https://code731.tistory.com/85
WITH bitwise AS (
SELECT d.ID, d.EMAIL, d.SKILL_CODE, s.NAME, s.CATEGORY
FROM DEVELOPERS d
JOIN SKILLCODES s
ON (d.SKILL_CODE & s.CODE) > 0
), dummy AS (
SELECT
ID, EMAIL, SKILL_CODE, NAME, CATEGORY,
IF(NAME='Python', 1, 0) AS python,
IF(NAME='C#', 1, 0) AS c,
IF(CATEGORY='Front End', 1, 0) AS fe
FROM
bitwise
), group_by AS (
SELECT
ID, EMAIL,
SUM(python) AS python,
sum(c) AS c,
sum(fe) AS fe
FROM dummy
GROUP BY ID, EMAIL
), grade AS (
SELECT
ID, EMAIL,
CASE
WHEN python > 0 AND fe > 0 THEN "A"
WHEN c > 0 THEN "B"
WHEN fe > 0 THEN "C"
ELSE "D"
END AS GRADE
FROM group_by
)
SELECT GRADE, ID, EMAIL
FROM grade
WHERE GRADE NOT IN ("D")
ORDER BY GRADE, ID
;
■ 비트 연산 (Bitwise operation)
SKILLCODES 와 CODE 를 비교하는 방법을 몰라서 제미나이에게 물어봤다. 비트 연산을 통해 가능하다고 한다. 다음은 제미나이의 답변이다.
[질문]
2진수 110010000 을 100000000, 10000000, 10000 으로 분리할 수 있는 방법이 있을까?
[답변]
네, 2진수 110010000을 100000000, 10000000, 10000으로 분리하는 것은 **비트 연산(Bitwise operation)**을 통해 가능합니다. 비트 연산은 2진수의 각 자리(비트)에 직접적인 논리 연산을 적용하여 특정 비트의 값을 추출하거나 변경하는 방법입니다.제시한 값들은 2진수 110010000의 각 자리에 있는 1에 해당하는 값들입니다.
110010000의 가장 왼쪽 1: 100000000
110010000의 두 번째 1: 10000000
110010000의 세 번째 1: 10000
이러한 개별 비트 값을 추출하기 위해서는 **AND 연산(&)**과 **마스크(Mask)**를 사용합니다.
비트 연산을 이용한 분리 방법
AND 연산: 두 개의 2진수 비트를 비교하여 둘 다 1일 경우에만 결과가 1이 되고, 그 외의 경우에는 0이 됩니다.
마스크: 특정 비트의 값을 추출하거나 필터링하기 위해 사용되는 2진수 패턴을 말합니다.
각 비트 값 분리 과정
1단계: 100000000 값 추출하기
원본: 110010000
마스크: 100000000
AND 연산: 110010000 & 100000000
결과:
110010000
& 100000000
-----------
100000000
가장 왼쪽 비트만 1이므로, 결과는 100000000이 됩니다.
2단계: 10000000 값 추출하기
원본: 110010000
마스크: 010000000 (8번째 자리의 1)
AND 연산: 110010000 & 010000000
결과:
110010000
& 010000000
-----------
010000000 (이것은 십진수 128에 해당하며, 이진수로 10000000과 같습니다)
이진수 10000000은 여덟 번째 자리(오른쪽에서부터 세면 7번째)가 1인 값입니다. 따라서 원본(110010000)의 여덟 번째 자리에도 1이 있으므로, AND 연산의 결과는 10000000이 됩니다.
3단계: 10000 값 추출하기
원본: 110010000
마스크: 000010000 (5번째 자리의 1)
AND 연산: 110010000 & 000010000
결과:
110010000
& 000010000
-----------
000010000 (이것은 십진수 16에 해당하며, 이진수로 10000과 같습니다)원본(110010000)의 다섯 번째 자리에도 1이 있으므로, AND 연산의 결과는 10000이 됩니다.
이러한 비트 연산을 사용하면 특정 위치의 1 값을 정확하게 분리해낼 수 있습니다. 이 기술은 컴퓨터 과학에서 데이터의 특정 플래그(flag) 상태를 확인하거나, 하드웨어 장치를 제어하는 데 널리 사용됩니다.
'CodingTest > SQL_Test' 카테고리의 다른 글
| [프로그래머스] 월별 잡은 물고기 수 구하기 (0) | 2025.10.13 |
|---|---|
| [프로그래머스] 물고기 종류 별 잡은 수 구하기 (0) | 2025.10.07 |
| [프로그래머스] 노선별 평균 역 사이 거리 조회하기 (0) | 2025.10.06 |
| [프로그래머스] 부서별 평균 연봉 조회하기 (1) | 2025.10.01 |
| [프로그래머스] 조건에 맞는 사원 정보 조회하기 (0) | 2025.09.29 |