[프로그래머스 LV.2] 조건에 맞는 개발자 찾기 — MySQL 정답 & 해설

2025. 11. 27. 16:48·코딩테스트/알고리즘

🔗 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
'코딩테스트/알고리즘' 카테고리의 다른 글
  • [프로그래머스 LV.2] 행렬의 곱셈 — Python 정답 & 해설
  • [프로그래머스 LV.1] 모의고사 — Python 정답 & 해설
  • [프로그래머스 LV.1] 두 개 뽑아서 더하기 — Python 정답 & 해설
  • [SWEA 1926] 간단한 369 게임 — Java 풀이 & 해설
작지만 꾸준한 성장으로
작지만 꾸준한 성장으로
contact
  • 작지만 꾸준한 성장으로
    파랑새
    작지만 꾸준한 성장으로
  • 전체
    오늘
    어제
    • 분류 전체보기 (26)
      • IT (3)
      • 코딩테스트 (23)
        • 알고리즘 (12)
        • MYSQL (11)
      • 패션 (0)
      • 독후감 (0)
      • TIL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SWEA
    python3
    알고리즘
    와이드 포맷 롱 포맷
    Pandas melt
    자바
    프로그래머스 lv.0
    데이터베이스
    long format
    프로그래머스
    Programmers
    CPU Bound
    데이터 전처리 파이프라인
    프로그래머스 lv.1
    파이썬
    코테
    코딩테스트
    프로그래머스 lv.2
    wide format
    파이썬코테
    Pandas groupby agg
    Python
    모델 추론
    데이터 리모델링
    I/O Bound
    공공데이터 전처리
    sql 코딩테스트
    백준
    mysql
    Pandas pivot
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
작지만 꾸준한 성장으로
[프로그래머스 LV.2] 조건에 맞는 개발자 찾기 — MySQL 정답 & 해설
상단으로

티스토리툴바