비트 연산자(bitwise operator), 프로그래머스 문제로 이해해 보자.

신 영·2024년 3월 5일
1

SQL

목록 보기
2/3
post-thumbnail

📌비트 연산자란?

SQL 기초 문법만 배운 상태에서 프로그래머스 SQL 고득점 Kit를 풀던 중 처음 보는 연산자를 발견했다.
평소 &(AND)라고 불리는 기호인데, SQL에서는 AND 연산에 사용되고, '비트 연산자' 중 하나이다.
비트 연산자에 대해 쉽게 설명한 내용은 아래 링크를 참고하면 된다.
✅아래 링크를 통한 이해가 선행되어야 나머지를 이해할 수 있다.

[해시넷] 비트 연산자 설명

그럼 비트 연산자의 작동 원리는 알겠는데, 어떻게 활용되는지 이해가 어렵다.
간단한 사례를 통해 알아보자.

a = 60, b = 13 이라 가정한다.
이를 이진법으로 표현하면 다음과 같다.
a = 0011 1100 → 2^5 + 2^4 + 2^3 + 2^2 = 60
b = 0000 1101 → 2^3 + 2^2 + 2^0 = 13
a와 b를 각 비트 연산자를 활용한 사례는 표의 가장 우측을 확인하면 된다.

출처: 유튜브 엔지니어한국


📌비트 연산자 실습

여기까지 이해가 되었다면 이제 문제를 풀어볼 시간!
Programmers 사이트의 SQL 고득점 Kit 중 SELECT 섹션의 문제이다.

조건에 맞는 개발자 찾기

문제를 요약하자면,
SKILLCODES 테이블에는 NAME, CATEGORY, CODE 컬럼이 있고
CODE는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성되어 있다.

DEVELOPERS 테이블에는 ID, FIRST_NAME, LAST_NAME, EMAIL, SKILL_CODE 컬럼이 있다.
SKILL_CODE 컬럼은 INTEGER 타입이고,
2진수로 표현했을 때 각 bit는 SKILLCODES 테이블의 코드를 의미한다.

Programmers에서는 친절하게도 예시 결과와 설명도 제공해 준다.


처음 마주했을 때 막막했지만 이제 우리는 비트 연산자, 그 중 &연산을 안다.
차근차근 원리를 확인 해보자.

✅ 먼저, SKILLCODES 테이블에서 Python과 C# 스킬에 해당하는 CODE의 합계를 계산하여 이를 이진수로 표현하면 어떻게 되는지 살펴보자. Python의 코드는 128 (2^7)이고, C#의 코드는 2 (2^1)이다. 이진법으로 표현하면 다음과 같다.

Python: 128 (b'10000000')
C#: 2 (b'00000010')
이 두 값을 합산하면 130 (b'10000010')이 된다.

✅ 이제 개발자의 SKILL_CODE와 이 값을 비트 AND 연산하여 해당 스킬을 가진 개발자를 찾는다. Python 및 C#의 CODE 합은 130 (b'10000010')이었으므로 다음과 같은 과정으로 조건에 맞는 개발자를 찾을 수 있다.

개발자의 SKILL_CODE: 130 (b'10000010')
Python 및 C# 스킬 코드: 130 (b'10000010')

✅ 각 비트를 AND 연산하여 스킬을 확인한다.

10000010 (개발자의 SKILL_CODE)
10000010 (Python 및 C# 스킬 코드)
---------
10000010

✅ 결과로 130 (b'10000010')이 나온다면, 개발자는 Python과 C# 스킬을 가지고 있는 것이다.
이와 같이 비트 AND 연산을 사용하여 개발자가 특정 스킬을 가졌는지 여부를 확인할 수 있다.


✅ 위의 원리로 작성한 SQL문은 다음과 같다.

select ID, EMAIL, FIRST_NAME, LAST_NAME
from DEVELOPERS
where SKILL_CODE & (select sum(CODE) 
					from SKILLCODES 
					where NAME in('Python','C#'))
order by ID

비트 연산자는 자주 사용되는 편은 아니지만
이 글에서 다룬 문제와 같은 경우 유용하게 사용될 수 있으니 알아두는 정도면 될 듯하다.

0개의 댓글

관련 채용 정보