신이 되고 싶은 갓지이

SQL 코테 연습 프로그래머스 Lv.1 정답률 40% 문제풀이 본문

SQL

SQL 코테 연습 프로그래머스 Lv.1 정답률 40% 문제풀이

갓지이 2025. 2. 3. 13:56

 

간만에 Sql 코테 연습하려다 Lv.1에서 Lv.4쯤에서 볼법한 정답률을 봐서 풀어보았다. 

 

1.특정 형질을 가지는 대장균 찾기(SELECT)

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제

2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.

 

각 대장균 별 형질을 2진수로 나타내면 다음과 같습니다.

ID 1 : 1000₍₂₎
ID 2 : 1111₍₂₎
ID 3 : 1₍₂₎
ID 4 : 1101₍₂₎

 

각 대장균 별 보유한 형질을 다음과 같습니다.

ID 1 : 4
ID 2 : 1, 2, 3, 4
ID 3 : 1
ID 4 : 1, 3, 4

 

따라서 2번 형질이 없는 대장균 개체는 ID 1, ID 3, ID 4 이며 이 중 1번이나 3번 형질을 보유한 대장균 개체는 ID 3, ID 4 입니다.

 

10진법으로 되어 있는 숫자를 2진법으로 변환하여 2진법의 자리수에 따라 형질 유무를 판별해야한다. 처음 문제를 풀 때는 단순하게 2진법의 자리수별로 0과 1을 채워넣어서 확인을했다. 정말 말 그대로 중학교때 배운 10진법을 2진법으로 변환하는 과정을 그대로 거쳤다.

다행히 문제는 모두 최대 4자리숫자(2진법기준)이었는지 모두 정답으로 나왔으나 더 큰 숫자가 존재할 경우 한계가 있는 방법이다. 

-- 1. 단순 작업
SELECT COUNT(ID) AS COUNT
FROM(
    SELECT ID
    , CASE WHEN FLOOR(GENOTYPE/8)=0 THEN 0
            WHEN FLOOR(GENOTYPE/8)=1 THEN 1
    END AS ID_4 -- 2진법 4번째 자리 확인
    , CASE WHEN FLOOR(MOD(GENOTYPE,8)/4)=0 THEN 0
            WHEN FLOOR(MOD(GENOTYPE,8)/4)=1 THEN 1
    END AS ID_3 -- 2진법 3번째 자리 확인
    , CASE WHEN FLOOR(MOD(MOD(GENOTYPE,8),4)/2)=0 THEN 0
            WHEN FLOOR(MOD(MOD(GENOTYPE,8),4)/2)=1 THEN 1
    END AS ID_2 -- 2진법 2번째 자리 확인
    , CASE WHEN MOD(MOD(MOD(GENOTYPE,8),4),2)=0 THEN 0
            WHEN MOD(MOD(MOD(GENOTYPE,8),4),2)=1 THEN 1
    END AS ID_1 -- 2진법 1번째 자리 확인
FROM ECOLI_DATA) A
WHERE (ID_3=1 OR ID_1=1) AND ID_2!=1

 

 

다음 생각한 방법으로는 확인하고자 하는 숫자가 앞 3자리 즉, 8로 나누었을 때 나머지이니 조건을 만족하는 숫자에만 flag를 달아서 확인하는 방법이다. 8로 나누었을때 나머지는 0~7이 존재하며 이중 조건을 만족하는 경우는 101,100,001 즉 10진법으로 전환하면 5,4,1이다. 

해당 방법으로한다면 4자리 이상의 숫자가 나와도 구할수 있게된다.

-- 2. 8로 나눈 나머지가 2진법상 101,100,001 이면 flag
SELECT COUNT(ID) AS COUNT
FROM (SELECT ID, CASE WHEN MOD(GENOTYPE,8) IN (5,4,1) THEN 1
                ELSE 0
            END AS CHK
FROM ECOLI_DATA )A
WHERE CHK=1