ღ yuni_world ღ

[MySQL] [프로그래머스 level 4] 언어별 개발자 분류하기 본문

MySQL/프로그래머스

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

ღ유닝이ღ 2025. 6. 4. 21:47

📌 문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/276036

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📌 문제풀이

with

raw1 as (
  select
    (select sum(code) from skillcodes where category = 'Front End') as FE,
    (select sum(code) from skillcodes where name = 'Python') as P,
    (select sum(code) from skillcodes where name = 'C#') as C
)

, raw2 as (
    select 
        case -- (1)'비트연산' 아래에서 추가 정리
            when (skill_code & FE > 0) and (skill_code & P > 0) then 'A'
            when skill_code & C > 0 then 'B'
            when skill_code & FE > 0 then 'C'
        end as grade,
        id, email
    from developers, raw1 -- (2)'카테시안 곱' 아래에서 추가 정리
)

select *
from raw2
where grade is not null
order by 1, 2

📖 NOTE(1)

  1. 비트 연산
    • SQL에서 & 연산자비트 AND 연산자로 숫자 간의 비트 단위 연산을 수행할 때 사용되며, 각 비트가 모두 1인 경우에만 1을 반환함 (비트 : 컴퓨터가 정보를 저장하고 처리할 때 사용하는 가장 작은 단위 로 0 또는 1 값만 가질 수 있음)
    • 비트연산 예시(해석 포함) 
      1. 프론트엔드 기술: HTML(1), CSS(2), JS(4) → 합치면 1+2+4 = 7 → 0111(2)
      2. 한 개발자의 SKILL_CODE가 5 → 0101(2) 이라 가정하자.
      3. 이 때, 5와 7 & 연산을 해보면 5 & 7 → 0101 & 0111 = 0101 → 5 가 나오게됨 (각 비트가 모두 1인 경우만 1 반환)
      4. 이 때 나온 값이 > 0이면 → 비트 중 겹치는 부분이 하나 이상 있다는 뜻 → 즉, 그 기술을 가지고 있다
      5. = 0이면 → 겹치는 비트가 하나도 없다는 뜻 → 즉, 기술 없음 을 의미함
  2. 카테시안 곱
    • 두 테이블의 모든 행모든 가능한 조합으로 결합하는 연산
      • 수학적으로는 A 집합의 요소가 n개, B 집합의 요소가 m개면 →  A × B의 결과는 n × m개 로 표현 가능
    •  예시
      • 테이블 A
        ID NAME
        1 Alice
        2 Bob
      • 테이블 B
        SKILL_ID SKILL_NAME
        101 HTML
        102 Python
      • 테이블A x 테이블B 결과
        ID  NAME  SKILL_ID  SKILL_NAME
        1 Alice 101 HTML
        1 Alice 102 Python
        2 Bob 101 HTML
        2 Bob 102 Python

📖 NOTE(2)

- 문제 설명 내에 아래와 같은 내용을 함께 알려줌

예를 들어 어떤 개발자의 SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.

 

- 위 내용은 developers 테이블에 있는 skill_code 와 skill_codes 테이블에 존재하는 code의 합을 활용하여 문제를 풀어야 한다는 것을 의미하며, 스킬의 코드는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성되어 있습니다.  문장을 통해 비트연산을 활용할 수 있음을 의미함

- 따라서 raw1 에서 각 스킬별 code의 합을 구해놓은 뒤, raw2에서 비트연산을 통해 각 개발자의 스킬코드가 포함되어 있는지 확인하여 분류