SQL/SQL 문제

프로그래머스) FrontEnd 개발자 찾기

서영환 2024. 8. 8. 13:24

문제) FrontEnd 개발자 찾기

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이 문제에서 요구하는 사항으로는 Front End 스킬을 가진 개발자의 정보를 조회하여 개발자의 ID, 이메일, 이름, 성을 ID를 기준으로 오름차순 정렬해주어야 한다.

 

그런데 간단 하게 생각하면 Front End가 idx 같은 고유의 식별 번호를 가진 테이블안에 있고 이것을 참조하는 테이블이 있을것으로 생각하였으나 문제에서 주어진 테이블에는 스킬에 대한 이름과 Back, Front 구분해주는 카테고리, 마지막으로 고유 CODE가 있었다.

 

CODE를 통하여 개발자 테이블을 조인해주면 끝나는데 이때 문제가 발생하였다. 왜냐하면 CODE를 비트 단위로 변경하여 조회를 해야 하는 문제가 생긴 것이다.

 

 

위의 그림처럼 문제사이트에서 비트로 구분하여 각 자리에 해당되는 것이 있으면 스킬이 가졌다고 간주하고 있기 때문이다

 

그렇다면 비트는 MYSQL에서 BIN()함 수를 통하여 간단하게 2진수로 표현이 가능하나 이것을 각자리에 해당되는지를 확인하기 위해서는 문자열을 어떻게든 잘라내야 되는데 문제는 이때 뒤의 숫자들도 같이 들어 있어서 구분이 어렵데 되었다.

 

더보기

실패 코드

select a.ID, a.EMAIL, a.FIRST_NAME, a.LAST_NAME
from DEVELOPERS as a join (
    select CODE from SKILLCODES where CATEGORY like 'Front%'
)as b on right(BIN(a.SKILL_CODE), LENGTH(BIN(b.CODE))) - BIN(b.CODE) = 0 and LENGTH(BIN(a.SKILL_CODE)) >= LENGTH(BIN(b.CODE))
order by a.ID

위의 방식은 일단 Front가 들어 있는 CODE를 가져와서 개발자 테이블과 조인을 하는 방식이다. 조인 때에는 right 함수를 이용하여 오른쪽에서 조회한 CODE의 수만큼 잘라내어 비교를 하는것인데 이 때 문제는 잘려질 때 뒤의 값들( 예를 들어 1110 이 있고 100을 비교할 때 110을 가져오고 100을 비교 그럼 10이 남게 된다) 때문에 원하는 정보를 얻을 수 없게 된다

 

고민의 고민의 거듭하여 어떻게 비트의 & 연산자까지는 찾았으나 이를 어떻게 사용해야 될지 잘 몰라 결국 내일배움캠프의 튜터님의 도움을 받게 되었다

 

이를 통하여 & 연산자의 경우 둘다 참(1111 이 있고 1010 을 & 연산 하면 1010을 출력)여야함 1을 반환 하는것으로 완벽히 이해를 할 수 있었다

또한 같이 알아두기 좋은 | 연산의 경우 둘중 하나만 참이면(1111 이 있고 1010을 | 연산하면 1111을 출력) 1을 반환한다

 

이렇게 해서 최종적으로 코드를 작성하게 될경우 아래 처럼 깔끔하게 코드가 작성 되는 것을 확인 할 수 있다.

 

더보기

정답 주의!!

select DISTINCT a.ID, a.EMAIL, a.FIRST_NAME, a.LAST_NAME
from DEVELOPERS as a join SKILLCODES as b on b.CODE = a.SKILL_CODE&b.CODE
where b.CATEGORY like 'Front End'
order by a.ID

 

이번 문제를 풀면서 SQL 문제 중 비트를 다루는 문제는 이걸로 2번째 였다. 그래서 그런지 생각보다 생각을 많이 하고 검색도 많이 해보았으나 자주 사용하지 않는 부분이라 원하는 결과를 즉각 습득하기가 어려웠다

 

그래도 알아두면 좋은 것이기에 비트 변환시 BIN 함수를 두 숫자의 비트 자리 비교에는 &, |  이 3가지만 기억해 두면 좋을거 같다