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을 확인한 후 수제로 비교해서 출력하게 끔 했다.

예시 코드는 통과했지만 채점에서 에러가 떴다.

 

틀린 코드가 잘못된 이유:

  1. BIN 함수 사용의 비효율성: BIN(SKILL_CODE)는 SKILL_CODE를 2진수 문자열로 변환했다. 이는 문자열 비교로 조건을 처리하게 되었는데, 이는 비효율적일 뿐만 아니라 정확하게 원하는 결과를 얻기 어렵다.
  2. 정확한 매칭 조건의 부재: LIKE '%1__________'와 같은 조건은 정확히 어떤 비트를 찾는지 명확하지 않다. 1의 위치와 다른 비트가 어떤 의미를 가지는지 정확히 정의되지 않기 때문에, 원하는 결과를 얻지 못할 가능성이 크다.
  3. 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_CODESKILLCODES 테이블의 CODE를 비트 연산을 통해 비교하여, 특정 스킬을 가진 개발자를 찾는 것이 목적이다.

해결 과정:

  1. 비트 연산을 통한 스킬 검증: 개발자의 SKILL_CODE에 대해 & 연산자를 사용하여 특정 스킬 코드가 포함되어 있는지 확인한다.
  2. 조건에 맞는 개발자 필터링: 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를 반환한다. 이와 같은 비트 연산을 통해 원하는 스킬을 가진 개발자를 찾을 수 있다.
반응형