프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
- SKILLCODES 테이블에는 기술 스택에 따라 카테고리 (백/프론트)와 CODE 값이 지정되어 있음
- DEVELOPERS 테이블에는 개발자마다 보유한 기술 스택에 대한 SKILL_CODE값이 있음
- SKILL_CODE는 개발자가 보유한 기술 스택의 CODE값의 합
- DEVELOPERS 테이블에서 FrontEnd 스킬을 가진 개발자 조회
- SKILL_CODE 컬럼은 INTEGER 타입이고, 2진수로 표현했을 떄 각 비트는 SKILLCODES 테이블의 코드를 의미 :
- 예를 들어 어떤 개발자의 SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미
코드
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = 'Front End')
ORDER BY ID;
코드설명
- 이 코드의 where절에 있는 서브쿼리는 SKILLCODES 테이블에서 category가 'Front End'인 모든 기술의 code 값을 더
- 개발자의 기술 스킬 코드의 합과 Front End 기술 코드의 합에 대해 bitwise and (&)를 적용합니다.
- 2의 결과가 0이 아니라면 TRUE로 간주하여 개발자의 SKILL_CODE가 Front End 스킬과 교집합을 가질 경우 해당 개발자를 선택합니다.
- ID를 기준으로 오름차순 정렬합니다.
여기서 추가적으로 이해를 돕기 위해 비트연산자에 대해 정리해보도록 하겠습니다.
비트연산자 AND (&)
피연산자 두 개가 모두 1일 때 1을 반환하는 연산자로, 결과는 다음과 같습니다.
- 0 & 0 = 0
- 0 & 1 = 0
- 1 & 0 = 0
- 1 & 1 = 1
- EX) 101 & 110 = 100
AND 말고도 OR, XOR등이 자주 사용되는데요, 이들의 기능은 다음과 같습니다.
- OR : 피연산자 두 개 중 하나라도 1이면 1을 반환
- XOR : 피연산자 두 개의 값이 같으면 0 반환, 다르면 1을 반환
AND 연산자의 기능을 이용해서 이 문제를 풀어볼건데요, 카테고리가 프론트엔드인 기술의 코드를 모두 더하면, 결과 값의 비트는 포함된 기술의 비트가 전부 켜져있는 상태일 겁니다.
예를들어 프론트 엔드 기술이 java script, react, vue이고 코드가 다음과 같다면 이 셋의 코드를 모두 합 한 결과는 위의 사진과 같습니다. 이 값과 개발자가 갖고 있는 코드의 합인 SKILL_CODE와 AND 연산을 하면, 개발자의 SKILL_CODE에 Front End에 해당되는 기술이 있다면 결과 비트에는 1 이 나올것입니다.
따라서 and연산의 결과가 모두 0이 아니라면, 즉 하나라도 front end에 해당되는 기술이 있다면 true가 되는 것입니다.
자세히 예시를 들어보면 다음과 같습니다.
만약 개발자의 skill_code가 8196으로, vue (8192)와 C++(4)기술을 갖고 잇다면
front end 기술 코드의 합인 10256과 and 연산을 했을 때 8192가 나오게 됩니다. 이는 vue의 코드와 같은것으로,
백엔드 기술인 C++은 걸러지고 front end기술인 vue만 남은것입니다.
따라서 개발자가 백엔드 기술만 갖고있다면, 10256과 and 연산을 했을 때 값은 0이 나오게 되겠죠. 반면 하나라도 프론트엔드 기술을 갖고있다면, true가 되어 해당 개발자의 정보를 조회하게 될 것입니다.
'SQL' 카테고리의 다른 글
[SQL] DATE TYPE 다루기 - 특정 일자 조회하기 DATE_FORMAT, YEAR(), MONTH(), (0) | 2025.01.28 |
---|---|
[프로그래머스 SQL KIT] JOIN #6 - 그룹별 조건에 맞는 식당 목록 출력 (1) | 2025.01.28 |
[프로그래머스 SQL KIT] JOIN #4 - 있었는데요 없었습니다 : 날짜 비교 연산 (0) | 2025.01.25 |
[프로그래머스 SQL KIT] JOIN #3 - 없어진 기록 찾기 (0) | 2025.01.25 |
[프로그래머스 SQL KIT] JOIN #2- 오랜기간 보호한 동물(1) (0) | 2025.01.25 |