반응형
반응형

출저 : 프로그래머스

 

SELECT 

문제풀이

 

A. 비트연산 사용

SELECT DISTINCT A.ID, A.EMAIL, A.FIRST_NAME, A.LAST_NAME FROM DEVELOPERS AS A
              LEFT JOIN SKILLCODES AS B ON (A.SKILL_CODE & B.CODE) =  B.CODE  
WHERE B.NAME IN ('Python', 'C#')
ORDER BY A.ID ASC


 

문제를 풀면서 처음 써본 비트연산. 

해당 코드는 JOIN 과정 중 조건에서 A.SKILL_CODE 와 B.CODE 의 값을 비트로 치환 후 비교한다

 

 

예를들어 SKILL_CODE에서 400(1_1001_0000)은  256(1_0000_0000) , 128(1000_0000), 16(1_0000)으로

이루어져 있어 B.CODE의 PYTHON, JAVASCRIPT, JAVA을 포함한다.

B.CODE와 비트연산시 저 3개의 비트(B.CODE)에서 TRUE이므로 저 3개를 가진 B.NAME을 반환한다...

이정도의 개념인데

1. (A.SKILL_CODE & B.CODE) =  B.CODE

2. A.SKILL_CODE & B.CODE 결과값이 같게 나왔다

 

 

이 부분에 대해서 좀 더 찾아봤다 요약하자면

 

1번은 특정 기술이 정확히 포함된 경우

2번은 특정 기술을 하나라도 포함한 경우 였다.

 

문제에서 모든 B.CODE들은 겹치지가 않아 해당문제에서는 문제될 일이 없다고 생각이 드는데 만약에 문제에서

A = 10(2)  , B=11(3)   ,   JAVA =01(1),  C=10(2) , C++ = 11(3) 라고한다면

2번을 했을경우  A는  C,  B는 JAVA, C, C++을 가지고 있게되고

1번은 A는 C를 가지지만 B는 C++ 만을 가지고 있게된다 

1. (A.SKILL_CODE & B.CODE) =  B.CODE → A=C , B= C++

2. A.SKILL_CODE & B.CODE                       A=C , B=  C++, JAVA, C

 

이 정도의 차이인데 문제 예시에서는 그런경우는 없으니 두 결과값이 같다고 나온다


 

그리고 비트연산을 했을경우 행이 중복으로 출력이 되는데

중복제거를 안하면 다른 테스트케이스에서 중복으로 출력될 수 있음

 

 

문제에서는 기술을 가진 개발자의 정보기 때문에 중복해서 결과를 뽑아낼 필요는 없기 때문에 DISTINCT를 사용하여 출력한다. (해당 문제의 예시는 DISTINCT 를 안써도 풀리지만 테스트케이스에서 실패라고 뜸...)

 


 

반응형

+ Recent posts

// 기업0 D-Day (표지) // 기업1 D-Day