on my way
[프로그래머스 코딩테스트 연습 SQL - 14] 조건에 맞는 개발자 찾기 (MySQL) | SQL BIT 연산 본문
algorithm/SQL
[프로그래머스 코딩테스트 연습 SQL - 14] 조건에 맞는 개발자 찾기 (MySQL) | SQL BIT 연산
wingbeat 2024. 8. 4. 04:48반응형
처음에 틀렸던 코드:
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE (BIN(SKILL_CODE) LIKE '%1__________') OR (BIN(SKILL_CODE) LIKE '%1________')
ORDER BY ID;
처음에는 SKILLCODES 테이블에서 PYTHON, C#의 BIN을 확인한 후 수제로 비교해서 출력하게 끔 했다.
예시 코드는 통과했지만 채점에서 에러가 떴다.
틀린 코드가 잘못된 이유:
- BIN 함수 사용의 비효율성: BIN(SKILL_CODE)는 SKILL_CODE를 2진수 문자열로 변환했다. 이는 문자열 비교로 조건을 처리하게 되었는데, 이는 비효율적일 뿐만 아니라 정확하게 원하는 결과를 얻기 어렵다.
- 정확한 매칭 조건의 부재: LIKE '%1__________'와 같은 조건은 정확히 어떤 비트를 찾는지 명확하지 않다. 1의 위치와 다른 비트가 어떤 의미를 가지는지 정확히 정의되지 않기 때문에, 원하는 결과를 얻지 못할 가능성이 크다.
- BIT 연산의 부재: 문제에서 요구한 비트 연산을 사용하지 않았다. 비트 연산을 통해 정확히 특정 스킬을 가진 개발자를 찾는 것이 필요했다.
BIT 연산 설명
비트 연산은 숫자를 2진수로 표현하여 각 비트 단위로 AND, OR, XOR 등의 연산을 수행하는 것이다.
SQL에서는 주로 특정 비트가 설정되어 있는지 확인하는 데 사용된다.
BIT 연산의 예:
- AND 연산 (
&
): 두 비트가 모두 1일 때만 1을 반환한다. - OR 연산 (
|
): 두 비트 중 하나라도 1이면 1을 반환한다. - XOR 연산 (
^
): 두 비트가 다르면 1, 같으면 0을 반환한다. - NOT 연산 (
~
): 비트를 반전시킨다.
예시:
-- 예를 들어 2진수 1010 (10)과 0110 (6)을 AND 연산하면:
SELECT 10 & 6; -- 결과는 2 (0010)
-- 예를 들어 2진수 1010 (10)과 0110 (6)을 OR 연산하면:
SELECT 10 | 6; -- 결과는 14 (1110)
2진수 변환 없이 연산이 가능한 이유:
SQL에서 비트 연산자는 숫자를 2진수로 자동 변환하여 연산을 수행한다.
따라서 숫자를 직접 2진수로 변환할 필요 없이 비트 연산을 사용할 수 있다.
문제 설명 및 해결 과정
이 문제에서는 개발자의 SKILL_CODE
와 SKILLCODES
테이블의 CODE
를 비트 연산을 통해 비교하여, 특정 스킬을 가진 개발자를 찾는 것이 목적이다.
해결 과정:
- 비트 연산을 통한 스킬 검증: 개발자의
SKILL_CODE
에 대해&
연산자를 사용하여 특정 스킬 코드가 포함되어 있는지 확인한다. - 조건에 맞는 개발자 필터링:
WHERE
절에서 Python과 C# 스킬을 가진 개발자를 찾는다.
정답 코드:
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 ID;
이 쿼리는 SKILL_CODE
에 대해 비트 AND 연산을 수행하여 Python이나 C# 스킬을 가진 개발자를 필터링한다.
비트 AND 연산은 각 비트 위치에서 1인 경우에만 1을 반환하기 때문에, 특정 스킬 코드가 포함되어 있는지 정확히 확인할 수 있다.
비트 연산 예시 설명:
- Python의
CODE
가 256 (100000000
in binary)이고, C#의CODE
가 1024 (10000000000
in binary)라고 가정한다. - 만약 개발자의
SKILL_CODE
가 1280 (10100000000
in binary)이라면, 이는 Python과 C# 스킬을 모두 포함하고 있음을 의미한다. 1280 & 256
은 256을 반환하고,1280 & 1024
는 1024를 반환한다. 이와 같은 비트 연산을 통해 원하는 스킬을 가진 개발자를 찾을 수 있다.
반응형
'algorithm > SQL' 카테고리의 다른 글
[프로그래머스 코딩테스트 연습 SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기 (MySQL) | RANK() 함수 (0) | 2024.08.04 |
---|---|
[프로그래머스 코딩테스트 연습 SQL] 업그레이드 된 아이템 구하기 (MySQL) (0) | 2024.08.04 |
[프로그래머스 코딩테스트 연습 SQL - 13] 노선별 평균 역 사이 거리 조회하기 (MySQL) (0) | 2024.08.04 |
[프로그래머스 코딩테스트 연습 SQL - 12] 조건별로 분류하여 주문상태 출력하기 (MySQL) (0) | 2024.07.16 |
[프로그래머스 코딩테스트 연습 SQL - 11] 카테고리 별 도서 판매량 집계하기 (MySQL) (0) | 2024.07.16 |