🔗 1. 문제 URL
프로그래머스 문제 바로가기 👉
https://school.programmers.co.kr/learn/courses/30/lessons/276034
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📝 2. 문제 요구사항 정리
이 문제는 SKILLCODES 테이블과 DEVELOPERS 테이블을 이용해
Python 또는 C# 스킬을 가진 개발자를 조회하는 문제입니다.
핵심은 SKILL_CODE가 비트(bit) 형태로 스킬을 표현한다는 점이며,
각 스킬은 2의 제곱수로 구성되어 있어 비트 AND 연산을 통해
해당 스킬을 보유하고 있는지 확인할 수 있습니다.
✔ 요구사항 요약
- Python 또는 C# 스킬을 가진 개발자를 조회합니다.
- 개발자의 ID, EMAIL, FIRST_NAME, LAST_NAME을 출력합니다.
- 결과는 ID 기준 오름차순 정렬합니다.
💡 3. 핵심 개념: 비트 AND (&) 연산
SKILL_CODE가 예를 들어 400이라면,
이 값은 2진수로 b’110010000’이 되고,
특정 스킬 CODE 값과 AND 연산을 했을 때 0보다 크면
해당 스킬을 포함하고 있다는 의미가 됩니다.
즉,
- Python CODE = 256 (= b’100000000’)
- 개발자 SKILL_CODE = 400 (= b’110010000’)
400 & 256 = 256 → 0보다 크면 Python 포함
따라서 조건은 이렇게 표현할 수 있습니다.
(S.CODE & D.SKILL_CODE) > 0
✅ 4. 정답 SQL 코드
-- 정답코드
SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM SKILLCODES S JOIN DEVELOPERS D
ON (S.CODE & D.SKILL_CODE) >
WHERE S.NAME = 'C#' OR S.NAME = 'PYTHON'
ORDER BY D.ID ASC;
-- 1) SKILL_CODE의 구조를 이해하지 못해 단순 비교로 접근했을 때 작성한 코드
SELECT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM SKILLCODES S JOIN DEVELOPERS D
ON S.CODE = D.SKILL_CODE
WHERE S.NAME = 'C#' OR S.NAME = 'PYTHON'
ORDER BY D.ID ASC;
-- 2) 비트 AND 연산을 떠올린 뒤 작성했지만, 결과 중복을 고려하지 않아 오답이었던 코드
-- (특정 개발자가 Python과 C#을 모두 가진 경우 중복 행이 발생합니다.)
-- (여기서 진짜 헤맸던 기억이 ...)
SELECT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM SKILLCODES S JOIN DEVELOPERS D
ON (S.CODE & D.SKILL_CODE) > 0
WHERE S.NAME = 'C#' OR S.NAME = 'PYTHON'
ORDER BY D.ID ASC;
💬 5. 풀이하면서 느낀 점
처음 문제를 읽었을 때는
“여러 스킬이 합쳐진 SKILL_CODE를 SQL에서 어떻게 분리해서 확인할까?”
라는 생각 때문에 접근이 잘 떠오르지 않았습니다.
그래서 처음에는 진법 관련 함수를 찾아보았지만,
문제 설명을 다시 천천히 읽어보면서
스킬 코드가 모두 2의 제곱수로 이루어져 있다는 부분이 눈에 들어왔습니다.
그 순간 비트 AND 연산이 떠올랐고,
스킬 여부를 확인하는 기준을 찾을 수 있었습니다.
이후 (S.CODE & D.SKILL_CODE) > 0 조건을 적용해보니
예시 테스트는 정상적으로 통과했지만,
제출 테스트에서는 전부 실패했습니다.
그 당시 더 이상 무엇이 잘못됐는지 몰랐었는데,
쿼리 흐름을 다시 따라가며 생각해보니
Python과 C#을 모두 가진 개발자는 JOIN 결과가 2행으로 생성되는 구조라는 점을 깨달았습니다.
즉, 같은 개발자가 두 번 조회될 수 있기 때문에
SELECT DISTINCT가 필요하다는 것을 깨닫고, 중복을 제거하여 조회하니 통과할 수 있었습니다.
➕ 깨달은 점
이 문제는 SQL 자체의 난이도보다는
비트마스크(bitmask) 구조를 이해하고 있는지가 중요하다고 생각합니다.
특정 스킬 보유 여부를 단순히 = 연산으로 비교할 수 없고,
비트 단위로 체크해야 한다는 아이디어를 생각해볼 수 있었습니다.
또한 JOIN으로 인해 발생하는 중복 행 문제도 경험해볼 수 있었는데,
쿼리가 정상적으로 작동하더라도
출력 결과가 원하는 형식과 일치하지 않을 수 있다는 점을
다시금 생각하게 된 문제였습니다.
궁금하신 점이나 포스팅에 대한 피드백이 있다면 댓글로 편하게 남겨주세요.
도움이 되셨다면 공감이나 댓글 한 줄 남겨주시면 포스팅을 이어가는 데 큰 힘이 됩니다. 😊
'코딩테스트 > 알고리즘' 카테고리의 다른 글
| [프로그래머스 LV.0] 배열 조각하기 — Python 정답 & 해설 (0) | 2026.06.11 |
|---|---|
| [프로그래머스 LV.2] 행렬의 곱셈 — Python 정답 & 해설 (0) | 2026.05.22 |
| [프로그래머스 LV.1] 모의고사 — Python 정답 & 해설 (0) | 2026.05.21 |
| [프로그래머스 LV.1] 두 개 뽑아서 더하기 — Python 정답 & 해설 (0) | 2026.05.21 |
| [SWEA 1926] 간단한 369 게임 — Java 풀이 & 해설 (0) | 2025.11.22 |