[SQL] 특정 형질을 가지는 대장균 찾기

Ray·2025년 3월 5일

SQL

목록 보기
13/39

🔎 문제설명

  • 출처: 프로그래머스
  • 사용언어(RDBMS): SQL(MySQL)
  • 문제:

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




✅ 제출답안

# 2번 형질을 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력
# (1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함)
SELECT COUNT(*) AS COUNT
FROM ECOLI_DATA 
WHERE BIN(GENOTYPE) NOT LIKE '%1_' AND
      (BIN(GENOTYPE) LIKE '%1' OR
      BIN(GENOTYPE) LIKE '%1__')



🚀 풀이기록

2진수를 나타내는 함수인 BIN()만 알면 풀줄 알았는데, 그게 아니었다. 각 자리의 해당하는 형질을 보유한다는 조건문을 WHERE절에 나타낼 때도 2번 형질을 보유하지 않으면서 1번이나 3번 형질을 보유하고 경우만 출력할지를 고려해야했었다. 형질을 나타내는 GENOTYPE의 최댓값은 15였다. 이를 이진수로 바꾸면 1111로 나타낼 수 있어 처음에는 4자리 기준으로 조건문을 만들었다. 그런데 결과는 틀리게 나왔다. 생각해보면 당연했다. 1번 형질만 가지는 경우는 0001이 아닌 1이기 때문이다. 이런 식으로 생각하면 2번 형질만 가지는 경우는 10이고, 3번 형질만 가지는 경우는 100이다. 그렇기 때문에 각각의 형질을 가지는 경우를 와일드카드(%, _)를 이용해 표현해보면

'%1'    # 1번 형질을 가지는 경우
'%1_'   # 2번 형질을 가지는 경우
'%1__'  # 3번 형질을 가지는 경우
'%1___' # 4번 형질을 가지는 경우

와 같게 된다. 와일드카드를 사용한 문자열에 LIKE, NOT LIKE 연산자를 사용해서 문제를 해결할 수 있었다.

WHERE 
BIN(GENOTYPE) NOT LIKE '%1_'   # 2번 형질을 가지지 않음
AND  # 그리고
(BIN(GENOTYPE) LIKE '%1' OR BIN(GENOTYPE) LIKE '%1__')   # 1번 형질이나 3번 형질을 가짐

WHERE 문에서 OR를 사용하면 합집합으로 처리되기 때문에 중복되는 부분을 신경쓰지 않아도 된다. 따라서 답이 위와 같이 된다.

profile
미래의 독자인 나를 위해 글을 씁니다.

0개의 댓글