코딩테스트/SQL

[프로그래머스][MySQL] Lv. 3 물고기 종류 별 대어 찾기

_알파카 2024. 7. 15. 18:35
728x90

문제 설명

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

정답 풀이

SELECT info.ID, name.FISH_NAME, info.LENGTH
FROM FISH_INFO info 
INNER JOIN FISH_NAME_INFO name ON info.FISH_TYPE = name.FISH_TYPE
WHERE (info.FISH_TYPE, info.LENGTH) IN (
                                        SELECT FISH_TYPE, MAX(LENGTH)
                                        FROM FISH_INFO
                                        GROUP BY FISH_TYPE)
ORDER BY info.ID;

 

 

풀이 방법

물고기 종류 별로 가장 큰 물고기에 대한 정보를 출력하는 문제이다. 

문제에서 주어진 조건은 다음과 같다. 

  • 물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력
  • 물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH
  • 물고기의 ID에 대해 오름차순
  • 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없다.

 

이제 차근차근 쉽게 문제를 해결해보자! 

1. 먼저, 각 물고기 종류별 최대 길이를 찾는 서브쿼리를 작성해본다. 

SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
FROM FISH_INFO
WHERE LENGTH IS NOT NULL
GROUP BY FISH_TYPE;

 

2. 메인 쿼리와 서브 쿼리를 결합한다. 

IN 연산자를 이용해 서브쿼리의 결과와 매칭되는 결과를 필터링한다. 

SELECT info.ID, info.FISH_TYPE, info.LENGTH
FROM FISH_INFO info
WHERE (info.FISH_TYPE, info.LENGTH) IN (
    SELECT FISH_TYPE, MAX(LENGTH)
    FROM FISH_INFO
    WHERE LENGTH IS NOT NULL
    GROUP BY FISH_TYPE
);

 

3. 문제의 조건에 맞게 테이블명, 정렬 방법을 지정해준다.  

SELECT info.ID, name.FISH_NAME, info.LENGTH
FROM FISH_INFO info
INNER JOIN FISH_NAME_INFO name ON info.FISH_TYPE = name.FISH_TYPE
WHERE (info.FISH_TYPE, info.LENGTH) IN (
    SELECT FISH_TYPE, MAX(LENGTH)
    FROM FISH_INFO
    WHERE LENGTH IS NOT NULL
    GROUP BY FISH_TYPE
)
ORDER BY info.ID;

 

 

다른 방법

서브쿼리를 사용하는 방법 말고도 CTE를 사용하는 방법도 있다. 

CTE(Common Table Expressions)는 쿼리의 중간 결과를 임시로 저장하고 사용할 수 있는 구조로, 

WITH 키워드를 통해 지정할 수 있다. 

WITH MaxLengthPerType AS (
    SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
    FROM FISH_INFO
    WHERE LENGTH IS NOT NULL
    GROUP BY FISH_TYPE
)
SELECT info.ID, name.FISH_NAME, info.LENGTH
FROM FISH_INFO info
	INNER JOIN MaxLengthPerType maxLen 
    	ON info.FISH_TYPE = maxLen.FISH_TYPE AND info.LENGTH = maxLen.MAX_LENGTH
	INNER JOIN FISH_NAME_INFO name 
    	ON info.FISH_TYPE = name.FISH_TYPE
ORDER BY info.ID;

 

위와 같이 'MaxLengthPerType' 이라는 CTE를 정의하여, 메인 쿼리와 조인한 후, 원하는 결과를 뽑아낼 수도 있다.

 

728x90