일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- trouble shooting
- 자격증준비
- 태블로
- 러닝스푼즈
- 자격증
- 취업부트캠프
- Python
- 프리온보딩
- 데이터분석가
- 부트캠프후기
- 코딩테스트
- Tableau Desktop Specialist
- 회고록
- 유데미부트캠프
- 데이터시각화
- 유데미
- 코테
- 파이썬
- tableau
- 쿼리테스트
- 프로그래머스
- SQL
- 데이터분석
- 2024년
- 유데미코리아
- 스타터스부트캠프
- 실습
- MySQL
- 프로젝트
- AICE
- Today
- Total
신이 되고 싶은 갓지이
SQL 코테 연습 프로그래머스 Lv.1 정답률 40% 문제풀이 본문
간만에 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
'SQL' 카테고리의 다른 글
SQL 코테 연습 프로그래머스 Lv.4 문제풀이 2 - 오류 추후 수정 필요 (2) | 2025.02.13 |
---|---|
SQL 코테 연습 프로그래머스 Lv.4 문제풀이 1 (1) | 2025.02.07 |
SQL 코테 연습 프로그래머스 Lv.2 정답률 45% 문제풀이 (2) | 2025.02.03 |
SQL 코테 연습 프로그래머스 Lv.2 문제풀이 (0) | 2023.12.19 |
맥북에서 오류 없이 MySql Community Edition설치하기 (version을 8.0.31로!) (0) | 2023.02.20 |