본문 바로가기
CodingTest/SQL_Test

[프로그래머스] 언어별 개발자 분류하기

by NeotenyAn 2025. 9. 27.

■ 문제 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) 상태를 확인하거나, 하드웨어 장치를 제어하는 데 널리 사용됩니다.