코딩테스트

SQL 코딩테스트 연습_프로그래머스_Level2 / 조건에 맞는 개발자 찾기

rkd-th 2025. 2. 20. 10:47

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

 

프로그래머스

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

programmers.co.kr

 

🔍문제 설명

[조건에 맞는 개발자 찾기]

SKILLCODES 테이블은 개발자들이 사용하는 프로그래밍 언어에 대한 정보를 담은 테이블입니다. 
SKILLCODES 테이블의 구조는 다음과 같으며, NAME, CATEGORY, CODE는 각각 스킬의 이름, 스킬의 범주, 스킬의 코드를 의미합니다.스킬의 코드는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성되어 있습니다.

DEVELOPERS 테이블은 개발자들의 프로그래밍 스킬 정보를 담은 테이블입니다. 
DEVELOPERS 테이블의 구조는 다음과 같으며, ID, FIRST_NAME, LAST_NAME, EMAIL, SKILL_CODE는 각각 개발자의 ID, 이름, 성, 이메일, 스킬 코드를 의미합니다. 
SKILL_CODE 컬럼은 INTEGER 타입이고, 2진수로 표현했을 때 각 bit는 SKILLCODES 테이블의 코드를 의미합니다.

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


문제
DEVELOPERS 테이블에서 Python이나 C# 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.
결과는 ID를 기준으로 오름차순 정렬해 주세요.

 

🔑문제 풀이

SELECT 
    ID, MAIL, IRST_NAME, AST_NAME
FROM 
    DEVELOPERS
WHERE 
    (SKILL_CODE & (SELECT SKILLCODES.CODE
                   FROM SKILLCODES 
                    WHERE NAME = 'Python') != 0)
    OR
    (SKILL_CODE & (SELECT SKILLCODES.CODE
                       FROM SKILLCODES 
                        WHERE NAME = 'C#') != 0)      
ORDER BY 
    ID;

 

| 처음에는 예시 처럼 DEVELOPERS 테이블의 SKILLCODES 값을 SKILLCODES의 CODE값으로 모두 구하려고 했다.

  이러한 과정에서 뇌정지가 와서, 20분동안 멍을 때렸다.

 

| 서브 쿼리를 두번 써서 비효율적인것 같다. 다른 방식이 있는지 찾아보았는데, 비트연산자를 이용한 JOIN이 있었다.

 테스트해보니 내가 작성한 코드보다 속도도 빠르고 정확한것 같다. 좀더..정진...