SQL

[프로그래머스 SQL KIT] JOIN #5 - FrontEnd 개발자 찾기 : bit 연산

enayoiii 2025. 1. 28. 17:53

프로그래머스 문제 보러가기

 

프로그래머스

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;

 

코드설명

  1. 이 코드의 where절에 있는 서브쿼리는 SKILLCODES 테이블에서 category가 'Front End'인 모든 기술의 code 값을 더
  2. 개발자의 기술 스킬 코드의 합과 Front End 기술 코드의 합에 대해 bitwise and (&)를 적용합니다.
  3. 2의 결과가 0이 아니라면 TRUE로 간주하여 개발자의 SKILL_CODE가 Front End 스킬과 교집합을 가질 경우 해당 개발자를 선택합니다.
  4. 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가 되어 해당 개발자의 정보를 조회하게 될 것입니다. 

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });