Problem Solving/프로그래머스

[MySQL] 프로그래머스 276035. FrontEnd 개발자 찾기

LeeJaeJun 2024. 3. 1. 10:52
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/276035

 

프로그래머스

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

programmers.co.kr

정답 코드
WITH FRONTEND_SKILLS AS(
    SELECT CODE
    FROM SKILLCODES
    WHERE CATEGORY = "Front End"
)

SELECT DISTINCT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS JOIN FRONTEND_SKILLS ON SKILL_CODE & CODE
ORDER BY ID;

# 여러 개의 skill들을 가지고 있으면 중복되어 나타날 수 있기 때문에 DISTINCT를 써줘야함
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS 
WHERE SKILL_CODE & (
        SELECT
            SUM(CODE)
        FROM
            SKILLCODES
        WHERE
            CATEGORY = 'Front End'
    )
ORDER BY ID;

# 전체 프론트엔드 코드들의 합과 연산하기 때문에 DISTINCT를 안써도 됨
# 하나라도 포함하고 있다면 한 비트라도 1을 가지고 있을테니까 True인거고
# 아예 없으면 0이니까 False가 나올 것임

예를 들어 어떤 개발자의 SKILL_CODE가 400 (=b'110010000')이라면, 이는 SKILLCODES 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.

-> 그렇기 때문에 SKILL_CODE = CODE라고 하면 안됨. 여러 스킬을 가지고 있는 사람은 스킬들의 합을 값으로 가지고 있기 때문에

 

BIN  함수

MySQL에서 10진수를 2진수로 변환

SELECT BIN(숫자);

 

문자열의 오른쪽 끝에서 특정 위치의 문자를 추출

# 문자열 '0010000'에서 오른쪽에서 5번째 문자를 추출하는 쿼리
SELECT SUBSTRING(RIGHT('0010000', 5), 1, 1);

# RIGHT('0010000', 5)는 문자열 '0010000'의 오른쪽 끝에서 5개의 문자를 가져옵니다. 
# 결과는 '10000'입니다.
# SUBSTRING('10000', 1, 1)는 위 결과로부터 첫 번째 문자를 추출합니다. 결과는 '1'입니다.
728x90
반응형