huginn muninn

[프로그래머스] 조건에 맞는 개발자 찾기 SQL 본문

코딩테스트

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

_maddy 2024. 4. 19. 01:30

 


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

 

프로그래머스

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

programmers.co.kr

 

 

어떻게 풀어야할지 모르겠어서 구글링하고 풀었습니다.

이 문제 덕분에 비트연산자 개념을 거의 3년 만에 다시 공부하게 되었습니다...ㅠㅜ 

 

정답 코드

SELECT
    id,
    email,
    first_name,
    last_name
FROM developers
WHERE
    skill_code & (
        SELECT SUM(code)
        FROM SKILLCODES
        WHERE NAME IN ("Python", "C#")
    ) != 0
ORDER BY ID

 

문제 풀이는 맨 아래에 있습니다.


 

비트연산자 & 연산

 

비트 AND 연산은 두 비트열(bitwise)을 비교할 때 사용되는 기본적인 연산 중 하나입니다. 이 연산을 수행하려면 두 비트열이 같은 길이를 가져야 하며, 각 위치에 있는 비트끼리 비교하여 두 비트 모두 1이면 결과의 해당 위치에 1을, 그렇지 않으면 0을 반환합니다.

비트 AND 연산의 기호는 & 입니다.

예를 들어, 두 8비트 이진수가 있다고 가정해 봅시다:

 

A = 11010101
B = 10111001
A와 B에 대해 비트 AND 연산을 수행하면 다음과 같습니다:

  11010101
& 10111001
----------
  10010001

 

각 비트 위치를 비교하면 다음과 같습니다:

 

  • 첫 번째 비트(왼쪽에서): 1 AND 1 = 1
  • 두 번째 비트: 1 AND 0 = 0
  • 세 번째 비트: 0 AND 1 = 0
  • 네 번째 비트: 1 AND 1 = 1
  • 다섯 번째 비트: 0 AND 1 = 0
  • 여섯 번째 비트: 1 AND 0 = 0
  • 일곱 번째 비트: 0 AND 0 = 0
  • 여덟 번째 비트: 1 AND 1 = 1


이처럼 각 비트의 AND 연산 결과를 나열하면 최종 결과는 10010001이 됩니다.

비트 AND 연산은 컴퓨터 프로그래밍에서 특정 비트의 값을 검사하거나 설정을 변경하는 데에 자주 사용됩니다. 예를 들어, 어떤 숫자에서 특정 비트가 설정되어 있는지(즉, 그 비트가 1인지)를 검사하거나, 특정 비트를 0으로 만드는데 사용할 수 있습니다.

 


문제풀이

 

 쿼리의 핵심은 SKILLCODES 테이블에서 Python과 C#에 해당하는 CODE 값을 합산하고, 이 합산된 값을 DEVELOPERS 테이블의 SKILL_CODE와 비교하여 Python이나 C# 스킬을 가진 개발자를 찾는 것입니다.

쿼리를 단계별로 분석해 보겠습니다.

1. SKILLCODES에서 Python과 C#의 CODE 값을 찾아 합산

 

SELECT SUM(code)
FROM SKILLCODES
WHERE NAME IN ("Python", "C#")

 

이 서브쿼리는 SKILLCODES 테이블에서 Python과 C#의 CODE 값을 찾아 그 합을 계산합니다. 예를 들어, Python의 CODE가 256이고, C#의 CODE가 1024라면, 합은 1280이 됩니다.

 

2. DEVELOPERS 테이블에서 해당 스킬 코드를 가진 개발자 찾기

 

WHERE
    skill_code & (
        SELECT SUM(code)
        FROM SKILLCODES
        WHERE NAME IN ("Python", "C#")

 

이 조건은 DEVELOPERS 테이블의 SKILL_CODE와 1단계에서 구한 합(예: 1280)에 대해 비트 AND 연산을 수행합니다. 결과가 0이 아니면, 해당 개발자는 Python이나 C# 스킬 중 하나 또는 둘 다 가지고 있다는 것을 의미합니다. 비트 AND 연산은 두 숫자의 각 비트를 비교하여 둘 다 1이면 결과의 해당 비트를 1로, 그렇지 않으면 0으로 설정합니다. 따라서, SKILL_CODE에 Python 또는 C#의 CODE 비트가 설정되어 있으면, AND 연산 결과는 0이 아닐 것입니다.

3. 결과 정렬 및 선택

 

SELECT
    id,
    email,
    first_name,
    last_name
FROM developers
...
ORDER BY ID

 

마지막으로, 해당 조건을 만족하는 개발자의 ID, 이메일, 이름, 성을 선택하고, ID를 기준으로 결과를 오름차순으로 정렬합니다.