| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- IELTS
- 해외결제
- is null
- having
- 서브쿼리
- 날짜 포맷
- LIMIT
- alias
- GROUP BY
- MySQL
- order by
- IN
- inner join
- ifnull
- MAX
- where
- Round
- date_format
- 투자자산운용사
- IS NOT NULL
- 도서추천
- count
- Python
- 금융IT
- programmers
- SQL
- join
- 금융 플랫폼
- 트래블테크
- SubQuery
- Today
- Total
Every Step Matters
[프로그래머스 SQL Lv.1] 특정 형질을 가지는 대장균 찾기 (MySQL) 본문
문제풀이 : https://school.programmers.co.kr/learn/courses/30/lessons/301646
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1. 테이블 : ECOLI_DATA
| Column name | Type | Nullable |
| ID | INTEGER | FALSE |
| PARENT_ID | INTEGER | TRUE |
| SIZE_OF_COLONY | INTEGER | FALSE |
| DIFFERENTIATION_DATE | DATE | FALSE |
| GENOTYPE | INTEGER | FALSE |
최초의 대장균 개체의 PARENT_ID는 NULL 값이다.
2. 문제
(1) 2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.
3. 문제풀이
형질을 이진수로 변환하고, 이진수를 이용하여 형질의 보유 유무를 찾는 것이 중요한 문제였다.
형질의 번호는 다음 예시와 같이 정수 값을 이진수로 변환해서 각 자리 비트에 대응된다. (오른쪽부터 차례대로 형질 1, 형질 2, ...)
- ID 1의 GENOTYPE이 8이면, 이진법으로 1000 -> 형질 4만 보유
- ID 2의 GENOTYPE이 15이면, 이진법으로 1111 -> 형질 1, 2, 3, 4 모두 보유
- ID 3의 GENOTYPE이 1이면, 이진법으로 0001 -> 형질 1만 보유
- ID 4의 GENOTYPE이 13이면, 이진법으로 1101 -> 형질 1, 3, 4 보유
그렇다면 이진수를 이용해서 형질 1 또는 3은 보유하고 형질 2는 보유하지 않은 대장균 개체를 어떻게 찾을까?
비트연산자를 이용해야 한다.
먼저 1번이나 3번 형질을 보유하고 있는지를 살펴보자. 형질 1 또는 3을 보유하기 위해서는 이진수 0101 과의 비트 AND(&) 연산 결과가 0보다 커야 한다.
예를 들어
- 형질 1만 보유한 개체의 GENOTYPE은 이진수로 0001 -> 이진수 0101과의 비트 AND(&) 연산 결과 : 0001(정수로 1)이므로 0보다 크다.
- 형질 3만 보유한 개체의 GENOTYPE은 이진수로 0100 -> 이진수 0101과의 비트 AND(&) 연산 결과 : 0100(정수로 4)이므로 0보다 크다.
- 형질 1과 3 모두 보유한 개체의 GENOTYPE은 이진수로 0101 -> 이진수 0101과의 비트 AND(&) 연산 결과 : 0101(정수로 5)이므로 0보다 크다.
- 형질 1과 3 모두 보유하지 않고 4만 보유한 개체의 GENOTYPE은 이진수로 1000 -> 이진수 0101과의 비트 AND(&) 연산 결과 : 0000(정수로 0)이므로 0보다 크지 않다.
따라서 WHERE genotype & 5 > 0 조건이 포함되어야 한다.
이때 이진수가 아니라 '5'로 비교하는 이유는, sql는 기본적으로 숫자를 십진수로 인식하고 비트연산자를 만나면 내부적으로 자동 이진 변환해서 비트연산하기 때문!
만약 이진수 자체로 비교하고 싶다면, 해당 값이 이진수임을 알려주는 0b(또는 MySQL 기준 b'0101'도 가능) 같은 이진수 리터럴을 사용하면 된다.
ex) WHERE genotype & 0b0101 > 0또는 WHERE genotype & b'0101' > 0
동일한 방식으로 2번 형질을 보유하지 않기 위해서는 이진수 0010과의 비트 AND(&) 연산 결과가 0이어야 한다. (보유하지 않기 때문!!)
따라서 WHERE genotype & 2 = 0 조건이 포함되어야 한다.
4. 정답
따라서 정답은
SELECT count(*) as count
FROM ecoli_data
WHERE genotype & 5 > 0 AND genotype & 2 = 0
Reference
https://wing-beat.tistory.com/140
[프로그래머스 코딩테스트 연습 SQL - 14] 조건에 맞는 개발자 찾기 (MySQL) | SQL BIT 연산
처음에 틀렸던 코드:SELECT ID, EMAIL, FIRST_NAME, LAST_NAMEFROM DEVELOPERSWHERE (BIN(SKILL_CODE) LIKE '%1__________') OR (BIN(SKILL_CODE) LIKE '%1________')ORDER BY ID;처음에는 SKILLCODES 테이블에서 PYTHON, C#의 BIN을 확인한 후 수제
wing-beat.tistory.com
SQL 관련 이진수 풀이 정리
이진수 잘 쓰면 굉장히 빠르다! 다만, 쿼리 가독성이 떨어지므로 간략하게 잘 쓸 것
velog.io
https://informatik.tistory.com/75
[SQL] 특정 형질을 가지는 대장균 찾기 풀이 / 비트 연산이란?
🧪 프로그래머스 문제: 특정 형질을 가지는 대장균 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 이 문제를 처음 접
informatik.tistory.com
'Database > SQL' 카테고리의 다른 글
| [프로그래머스 SQL Lv.1] 조건에 부합하는 중고거래 댓글 구하기 (MySQL) (0) | 2025.11.27 |
|---|---|
| [프로그래머스 SQL Lv.1] 과일로 만든 아이스크림 고르기 (MySQL) (0) | 2025.11.27 |
| [프로그래머스 SQL Lv.1] 가장 큰 물고기 10마리 구하기 (MySQL) (0) | 2025.11.27 |
| [프로그래머스 SQL Lv.1] 가장 비싼 상품 구하기 (MySQL) (0) | 2025.11.27 |
| [프로그래머스 SQL Lv.1] 잔챙이 잡은 수 구하기 (MySQL) (0) | 2025.11.27 |