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

🚀[SQL 알고리즘 문제 풀이] Programmers : 물고기 종류 별 대어 찾기(MAX)

by gwon_s 2026. 4. 19.

👇 물고기 종류 별 대어 찾기

 

프로그래머스

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

programmers.co.kr

 

🔓 문제 설명

물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.

물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
결과는 물고기의 ID에 대해 오름차순 정렬해주세요.
단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없습니다.

(10cm 이하의 물고기는 NULL 처리)

 

예시 문제 데이터

[FISH_INFO]

ID FISH_TYPE LENGTH TIME
0 0 30 2021-12-04
1 0 50 2020-03-07
2 0 40 2020-03-07
3 1 20 2022-03-09
4 1 NULL 2022-04-08
5 2 13 2021-04-28
6 0 60 2021-07-27
7 0 55 2021-01-18
8 2 73 2020-01-28
9 1 73 2021-04-08
10 2 22 2020-06-28
11 2 17 2022-12-23

 

[FISH_NAME_INFO]

FISH_TYPE FISH_NAME
0 BASS
1 SNAPPER
2 ANCHOVY

 


⚡SQL Query

MySQL & Oracle 정답

 

SELECT FI.ID AS ID
    , FNI.FISH_NAME AS FISH_NAME
    , FI.LENGTH AS LENGTH
FROM FISH_INFO FI JOIN FISH_NAME_INFO FNI
    ON FI.FISH_TYPE = FNI.FISH_TYPE
WHERE (FI.FISH_TYPE, FI.LENGTH) IN (
    SELECT FISH_TYPE, MAX(LENGTH)
    FROM FISH_INFO
    GROUP BY FISH_TYPE
)

 

Oracle 정답

SELECT SUB.ID, FNI.FISH_NAME, SUB.LENGTH
FROM (
    SELECT ID, FISH_TYPE, LENGTH,
           RANK() OVER (PARTITION BY FISH_TYPE ORDER BY LENGTH DESC) AS RK
    FROM FISH_INFO
) AS SUB
JOIN FISH_NAME_INFO FNI ON SUB.FISH_TYPE = FNI.FISH_TYPE
WHERE RK = 1
ORDER BY ID ASC;

🔎 풀이 설명

MySQL & Oracle 풀이

1. 조인

  • 물고기 이름을 알기 위해 각 테이블의 FISH_TYPE으로 결합합니다.

2. 다중 조건

  • WHERE (FI.FISH_TYPE, FI.LENGTH) IN ()을 통해 각 타입별 최대 크기가 맞는지 확인합니다.

 

Oracle 풀이

1. FROM절

  • 우선 FISH_INFO 테이블에서 FISH_TYPE별 물고기 크기(LENGTH)를 내림차순으로 정렬합니다.

2. 조인

  • 물고기 이름을 알기 위해 각 테이블의 FISH_TYPE으로 결합합니다.

3. 순위 조건

  • RANK() OVER()에 조건을 주어 각 그룹(PATITION)1순위를 추출할 수 있도록 조건을 주었습니다.

💡인사이트

1. NULL 처리

  • MAX() 함수와 IN() 으로 비교 시 NULL인 행은 자연스럽게 제외됩니다.

 

2. 순위 함수

  • ROW_NUMBER(): 1순위를 추출 시 최상위 1행만 출력합니다.(공동 1위가 있어도 내부 기준에 따라 딱 하나만 출력)
  • RANK(): 1순위 추출 시 공동 1위를 모두 출력합니다.(1위가 3명이면 3명 다 출력 → 다음 순위는 4위)
  • DENSE_RANK(): 1순위 추출 시 공동 1위를 모두 출력합니다.(1위가 3명이면 3명 다 출력 → 다음 순위는 2위)

 

3. 인덱스 설계

  • FISH_INFO 테이블에 (FISH_TYPE, LENGTH DESC) 인덱스가 있다면, 서브쿼리의 GROUP BYMAX() 연산은 효율적으로 처리됩니다.