본문 바로가기
🗄️ DB_이야기/# ⚡SQL

🚀[SQL 알고리즘 문제 풀이] Programmers : 대장균의 크기에 따라 분류하기 2(SELECT)

by gwon_s 2026. 4. 17.

👇 대장균의 크기에 따라 분류하기 2

 

프로그래머스

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

programmers.co.kr

 

🔓 문제 설명

대장균 개체의 크기를 내름차순으로 정렬했을 때 상위 0% ~ 25% 를 'CRITICAL', 26% ~ 50% 를 'HIGH', 51% ~ 75% 를 'MEDIUM', 76% ~ 100% 를 'LOW' 라고 분류합니다.

대장균 개체의 ID(ID) 와 분류된 이름(COLONY_NAME)을 출력하는 SQL 문을 작성해주세요.

이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요 .

단, 총 데이터의 수는 4의 배수이며 같은 사이즈의 대장균 개체가 서로 다른 이름으로 분류되는 경우는 없습니다.

 

예시 문제 데이터(ECOLI_DATA)

ID PARENT_ID SIZE_OF_COLONY DIFFERENTIATION_DATE GENOTYPE
1 NULL 10 2019-01-01 5
2 NULL 2 2019-01-01 3
3 1 100 2020-01-01 4
4 2 16 2020-01-01 4
5 2 17 2020-01-01 6
6 4 101 2021-01-01 22
7 6 101 2022-01-01 23
8 6 1 2022-01-01 27

⚡SQL Query

SELECT ID,
    CASE 
        WHEN PER <= 0.25 THEN 'CRITICAL'
        WHEN PER <= 0.50 THEN 'HIGH'
        WHEN PER <= 0.75 THEN 'MEDIUM'
        ELSE 'LOW'
    END AS COLONY_NAME
FROM (
    SELECT ID, 
           PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) AS PER
    FROM ECOLI_DATA
) AS SUB
ORDER BY ID ASC;

 


🔎 풀이 설명

1. 백분율 변환: PERCENT_RANK() 윈도우 함수를 사용하여 SIZE_OF_COLONY가 큰 순서로 0부터 1까지의 순위를 계산합니다.

2. 구간 분류: CASE문을 사용하여 4개의 구간으로 나누어 이름을 부여합니다.

3. 정렬


💡인사이트

1. Window Sort와 메모리

  • PERCENT_RANK()는 전체 결과 집합을 메모리에 올린 후 정렬합니다
  • 데이터가 많을 경우 Temp Tablespace를 사용하여 성능이 떨어질 수 있습니다.

 

2. TOP-N 최적화 불가

  • 분위수 계산은 전체 범위를 알아야 하므로 부분 범위 처리가 불가능합니다.
  • 분쉬수순위를 구하는 함수가 쿼리에 포함 되있다면 인덱스 존재 여부와 상관없이 Full ScanSort가 발생합니다.
    • 만약, SIZE_OF_COLONY 인덱스가 존재 한다 정렬 부하는 완화할 수 있습니다.