프로그래머스 - 조건에 맞는 개발자 찾기

윤민선·2026년 6월 21일

프로그래머스

목록 보기
24/74

문제 설명

DEVELOPERS 테이블과 SKILLCODES 테이블을 활용해 Python 또는 C# 스킬을 가진 개발자의 ID, 이메일, 이름, 성을 ID 오름차순으로 조회하는 문제이다.

테이블주요 컬럼
DEVELOPERSID, FIRST_NAME, LAST_NAME, EMAIL, SKILL_CODE
SKILLCODESNAME, CATEGORY, CODE

SKILL_CODE는 개발자가 가진 여러 스킬을 비트로 합친 값이다. 예를 들어 SKILL_CODE = 400은 이진수로 110010000이며, 이는 256(Python) + 128(Java) + 16(JavaScript) 비트가 합쳐진 값이다. 즉 두 테이블에는 단순히 같은 값을 가진 공통 컬럼이 없고, 비트 연산으로 연결해야 하는 구조이다.


접근 방법

연결 조건(ON) 부터 정리하면, SKILL_CODECODE는 단순 = 비교로 매칭되는 값이 아니다. SKILL_CODE는 여러 스킬 비트가 합쳐진 값이므로, 특정 스킬(CODE)이 그 안에 포함되어 있는지 확인하려면 비트 연산자 &을 사용해야 한다. 이전에 풀었던 특정 형질을 가지는 대장균 찾기에서 GENOTYPE & 값으로 형질 보유 여부를 확인했던 것과 동일한 원리이다.

ON (D.SKILL_CODE & S.CODE) = S.CODE

& 연산 결과가 S.CODE와 같다는 것은, 개발자의 SKILL_CODE 안에 해당 스킬의 비트가 전부 포함되어 있다는 의미이다.

필터 조건(WHERE)은 "Python 또는 C#"이므로, IN을 사용했다.

WHERE S.NAME IN ('Python', 'C#')

한 개발자가 Python과 C# 스킬을 모두 가지고 있다면, JOIN 결과에 그 개발자가 2번 나오게 된다. 이를 방지하기 위해 DISTINCT로 중복을 제거해야 한다.

구체적으로 정리한 풀이 흐름:

  1. DEVELOPERSSKILLCODES(D.SKILL_CODE & S.CODE) = S.CODE 조건으로 INNER JOIN
  2. WHERE S.NAME IN ('Python', 'C#')로 Python 또는 C# 스킬 필터
  3. SELECT DISTINCT로 중복 제거 (한 개발자가 두 스킬을 모두 가진 경우 대비)
  4. ORDER BY D.ID로 오름차순 정렬

최종 코드

SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS D
INNER JOIN SKILLCODES S ON (D.SKILL_CODE & S.CODE) = S.CODE
WHERE S.NAME IN ('Python', 'C#')
ORDER BY D.ID

0개의 댓글