👇 조건에 맞는 개발자 찾기
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
🔓 문제 설명
DEVELOPERS 테이블에서 Python이나 C# 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.
결과는 ID를 기준으로 오름차순 정렬해 주세요.
예시 문제 데이터
[SKILLCODES]
| NAME | CATEGORY | CODE |
| C++ | Back End | 4 |
| JavaScript | Front End | 16 |
| Java | Back End | 128 |
| Python | Back End | 256 |
| C# | Back End | 1024 |
| React | Front End | 2048 |
| Vue | Front End | 8192 |
| Node.js | Back End | 16384 |
[DEVELOPERS]
| ID | FIRST_NAME | LAST_NAME | SKILL_CODE | |
| D165 | Jerami | Edwards | jerami_edwards@grepp.co | 400 |
| D161 | Carsen | Garza | carsen_garza@grepp.co | 2048 |
| D164 | Kelly | Grant | kelly_grant@grepp.co | 1024 |
| D163 | Luka | Cory | luka_cory@grepp.co | 16384 |
| D162 | Cade | Cunningham | cade_cunningham@grepp.co | 8452 |
⚡SQL Query
MySQL & PostgreSQL
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')
OR SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')
ORDER BY ID ASC;
Oracle
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE BITAND(SKILL_CODE, (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python')) > 0
OR BITAND(SKILL_CODE, (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#')) > 0
ORDER BY ID ASC;
- Oracle에서 WHERE [숫자] 형태는 문법 오류이며, 반드시 WHERE [숫자] > 0 또는 WHERE [숫자] = 256과 같이 결과가 True/False가 되는 논리식으로 만들어줘야 합니다. 따라서 더미 비교 연산자(> 0)를 통해 논리식을 완성해주었습니다.
🔎 풀이 설명
1. 조건 필터링: 'Pyhon'과 'C#' 스킬코드를 추출합니다.
2. 비트 연산: 개발자의 스킬코드와 위에서 추출한 스킬코드와 AND연산을 합니다.
| ID | NAME | SKILL_CODE | Python(256) 검사 | C#(1024) 검사 | 결과 |
| D161 | Carsen | 2048 | 2048 & 256 = 0 | 2048 & 1024 = 0 | 탈락 |
| D162 | Cade | 8452 | 8452 & 256 = 256 | 8452 & 1024 = 0 | 합격 (Python) |
| D163 | Luka | 16384 | 16384 & 256 = 0 | 16384 & 1024 = 0 | 탈락 |
| D164 | Kelly | 1024 | 1024 & 256 = 0 | 1024 & 1024 = 1024 | 합격 (C#) |
| D165 | Jerami | 400 | 400 & 256 = 256 | 400 & 1024 = 0 | 합격 (Python) |
💡인사이트
1. 서브 쿼리 vs Join
- WHERE절에 서브쿼리를 쓰면 가독성은 좋지만, 대용량 데이터의 경우 JOIN이 가능하다면 JOIN으로 풀어내는 것이 옵티마이저가 실행 계획을 세우기에 더 유리할 수 있습니다.
3. 실행 계획
- MySQL: & 연산자를 사용하면 기본적으로 인덱스를 타지 못하고 Table Full Scan을 수행합니다.
- Oracle: BITAND 역시 함수이므로 인덱스 컬럼을 가공한 형태가 되어 Full Scan을 합니다. 하지만 Oracle은 이를 해결하기 위해 함수 기반 인덱스(FBI)를 생성할 수 있는 강력한 기능을 제공합니다.
'🗄️ DB_이야기 > # ⚡SQL' 카테고리의 다른 글
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 대장균의 크기에 따라 분류하기 1(SELECT) (0) | 2026.04.16 |
|---|---|
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 대장균들의 자식의 수 구하기(SELECT) (1) | 2026.04.15 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : Python 개발자 찾기(SELECT) (0) | 2026.04.15 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 업그레이드 된 아이템 구하기(SELECT) (0) | 2026.04.15 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 상위 n개 레코드(SELECT) (0) | 2026.04.15 |