728x90
반응형

안녕하세요!
오늘은 프로그래머스 SQL 고득점 Kit 중 SELECT 분야의 ‘조건에 맞는 개발자 찾기’ 문제 리뷰를 진행하겠습니다.

문제는 아래 링크에서 확인해주시면 됩니다.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 문제 설명

 

  • 문제

 

  • 예시

728x90

  • 문제를 파악하며 쿼리 생각하기

예시에서 볼 수 있듯이, 저희가 문제에서 SELECT 해야 하는 부분은

  1. 개발자 ID : ID
  2. 이메일 : EMAIL
  3. 이름 : FIRST_NAME
  4. 성 : LAST_NAME

총 4개인 것을 볼 수 있습니다.

다음으로 저희가 WHERE 조건으로 확인해야 하는 부분은

  1. C# 혹은 Python 스킬을 가진 개발자 : NAME IN (‘C#’, ‘Python’)
    → 이름이 아니고 각 스킬에 해당하는 CODE 값으로 진행해도 됩니다. (CODE IN (1024, 256))

총 1개인 것을 확인할 수 있습니다.

다음으로 두 개의 테이블을 JOIN 해야하는 부분은

  1. DEVELOPERS 테이블의 SKILL_CODE 이진수 값 안에 SKILLCODES 테이블의 CODE 값이 들어있는 경우 : JOIN SKILLCODES b ON a.SKILL_CODES&b.CODE=b.CODE
    → 여기서 a는 DEVELOPERS 테이블의 별칭입니다.
    → 문제 설명처럼 개발자의 스킬 코드는 각 스킬 코드의 합으로 이루어져 있기 때문에, 어떤 합으로 이루어졌는지 알기 위해서는 비트 연산 &를 진행해야 합니다.

    ※ & 연산자는 이진수로 변경했을 때, 각 자릿수를 비교하여 동일하면 1, 다르면 0을 반환하는 연산자 입니다.
    → 문제 설명의 예시를 보시면 400(110010000)은 256(100000000)+128(10000000)+16(10000) 이고, 이를 각각 400과 &연산자를 진행하면 다음과 같은 결과물을 얻을 수 있습니다.

    ① 400&256 = 110010000&100000000 = 100000000 = 256
    ② 400&128 = 110010000&10000000 = 10000000 = 128
    ③ 400&16 = 110010000&10000 = 10000 = 16

    즉, DEVELOPERS의 SKILL_CODE와 CODE의 & 연산의 값이 CODE로 나오는 값개발자가 가진 스킬이라고 볼 수 있습니다.

위와 같은 것을 확인할 수 있습니다.

마지막으로 저희가 문제에서 확인해야 하는 부분은

  1. 개발자 ID로 오름차순 : ORDER BY ID

총 1개인 것을 확인할 수 있습니다.

 

  • 쿼리 완성하기

이제 위에서 생각한 쿼리를 SQL 실행순서에 맞게 배치해주시면 됩니다.
그렇게 완성된 쿼리는 아래와 같습니다.

-- C#과 Python 모두를 가진 개발자는 두 번 출력이 되기 때문에 DISTINCT를 해주어 중복값을 제거해줍니다.
SELECT  DISTINCT
        ID,
        EMAIL,
        FIRST_NAME,
        LAST_NAME
FROM    DEVELOPERS a
JOIN    SKILLCODES b ON a.SKILL_CODE&b.CODE=b.CODE
WHERE   NAME IN ('C#', 'Python')
ORDER BY 1


궁금한 부분이 있으신 분들은 댓글로 남겨주시면, 답변 드리도록 하겠습니다.

★읽어주셔서 감사합니다★

728x90
반응형

+ Recent posts