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

yenpkr·2025년 3월 10일
0

sql

목록 보기
49/91

문제

제출

SELECT id,email,first_name,last_name
from developers
where skill_code & (select code from SKILLCODES where name = 'python') or
      skill_code & (select code from SKILLCODES where name = 'c#')
order by 1 asc

skill_code & (select code from SKILLCODES where name = 'python')
이 연산의 결과가 0이 아닌지, 0인지에 따라 skill_code가 ‘python’을 포함하는지 여부를 알 수 있습니다.

  • python의 code 값이 4로 가정(0100)
  • skill_code 값이 5일 경우(0101)
    skill_code & (select code from SKILLCODES where name = 'python')
    5 & 4 → 0101 & 0100 → 0100
    → 결과: 4 (0이 아니므로, python을 포함하는 스킬을 보유한 것으로 판단)
  • skill_code 값이 2일 경우(0010)
    skill_code & (select code from SKILLCODES where name = 'python')
    2 & 4 → 0010 & 0100 → 0000
    → 0 (0이므로, python을 포함하지 않는 스킬을 보유한 것으로 판단)

🚨 error

SELECT a.id,a.email,a.first_name,a.last_name
from developers a
join (select id,CONV(skill_code,10,2) abcode from developers) b
on a.id = b.id
where substr(abcode,-9,1) = 1 or substr(abcode,-11,1) = 1
order by 1 asc

이렇게 제출하면 예제에서는 통과, 제출하면 18점이 나왔다.
skillcodes 테이블에서 가져와서 사용해야해서 점수가 18점만 나온 것 같다.

📌 새로 배운 내용

✅ 비트 연산자

이진수 형태의 데이터에 대해 각 비트 단위로 연산을 수행하는 데 사용

  • 비트 AND (&)
    두 값의 대응하는 비트가 모두 1일 때만 결과 비트가 1이 됩니다.

    SELECT 6 & 3;  -- 결과: 2

    6의 이진수: 110
    3의 이진수: 011
    6 & 3의 결과는 010 (즉, 2)

  • 비트 OR (|)
    두 값의 대응하는 비트 중 하나라도 1이면 결과 비트가 1이 됩니다.

    SELECT 6 | 3;  -- 결과: 7

    6의 이진수: 110
    3의 이진수: 011
    6 | 3의 결과는 111 (즉, 7)

  • 비트 XOR (^)
    두 값의 대응하는 비트가 다를 때만 결과 비트가 1이 됩니다.

    SELECT 6 ^ 3;  -- 결과: 5

    6의 이진수: 110
    3의 이진수: 011
    6 ^ 3의 결과는 101 (즉, 5)

  • 비트 NOT (~)
    숫자의 각 비트를 반전시킵니다. 1은 0으로, 0은 1로 바뀝니다.

    SELECT ~6;  -- 결과: -7

    6의 이진수: 00000000 00000000 00000000 00000110
    ~6의 결과는 11111111 11111111 11111111 11111001 (즉, -7)
    여기서 결과가 -7인 이유는 MySQL에서 음수는 2의 보수를 사용하여 표현되기 때문입니다.

  • 비트 왼쪽 시프트 (<<)
    숫자의 비트를 왼쪽으로 이동시키고, 오른쪽에는 0이 채워집니다.

    SELECT 3 << 2;  -- 결과: 12

    3의 이진수: 11 (2비트)
    3 << 2는 1100 (즉, 12)

  • 비트 오른쪽 시프트 (>>)
    숫자의 비트를 오른쪽으로 이동시키고, 왼쪽에는 0이 채워집니다.

    SELECT 12 >> 2;  -- 결과: 3

    12의 이진수: 1100
    12 >> 2는 11 (즉, 3)

참조 블로그

0개의 댓글