프로그래머스/MySQL

물고기 종류 별 대어 찾기

chaev2ly 2026. 1. 8. 13:28

https://school.programmers.co.kr/learn/courses/30/lessons/293261

 

프로그래머스

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

programmers.co.kr

 

📌 문제 핵심 요약

각 물고기 종류(FISH_TYPE) 별로 가장 길이가 큰 물고기의 ID, 물고기 이름, 길이를 출력한다.

[조건]

  • 종류별 최대 길이 물고기는 항상 1마리만 존재
  • 10cm 이하 물고기가 최대인 경우는 없음
  • 결과는 물고기 ID 오름차순 정렬

 

🔑 핵심 아이디어 : ROW_NUMBER()로 “종류별 1등” 뽑기

이 문제의 본질은 물고기 종류별로 길이를 기준으로 가장 큰 것을 남기는 것이다. 이럴 때 가장 깔끔한 방법이 윈도우 함수 + ROW_NUMBER()를 사용하는 것이다.

 

1. 물고기 이름을 얻기 위해 FISH_NAME_INFO 테이블과 JOIN

2. 종류별 길이 순 정렬 + 순번 부여

ROW_NUMBER() OVER (
    PARTITION BY FI.FISH_TYPE
    ORDER BY FI.LENGTH DESC
) AS RN
  • PARTITION BY FI.FISH_TYPE : 물고기 종류별로 그룹 분리
  • ORDER BY FI.LENGTH DESC : 길이가 큰 순서대로 정렬
  • ROW_NUMBER() : 각 그룹에서 1등부터 순번 부여

3. 가장 큰 물고기만 필터링

 

왜 GROUP BY + MAX로 풀지 않았는가?

최대 길이는 구할 수 있지만 그 물고기의 ID를 알 수 없다. 서브쿼리를 겹겹이 써서 해결할 수는 있지만, 가독성과 안정성 모두 떨어진다.

 

SELECT ID, FISH_NAME, LENGTH
FROM (
    SELECT FI.ID, FN.FISH_NAME, FI.LENGTH,
            ROW_NUMBER() OVER (
                PARTITION BY FI.FISH_TYPE
                ORDER BY FI.LENGTH DESC
            ) AS RN
    FROM FISH_INFO FI
    JOIN FISH_NAME_INFO FN ON FI.FISH_TYPE = FN.FISH_TYPE
) T
WHERE RN = 1
ORDER BY ID
;