본문 바로가기
DB_이야기

🚀[SQL 알고리즘 문제 풀이] Programmers : 노선별 평균 역 사이 거리 조회하기(with ORDER BY)

by gwon_s 2025. 5. 6.

🔓 문제 설명

SUBWAY_DISTANCE 테이블은 서울지하철 2호선의 역 간 거리 정보를 담고 있는 테이블입니다.
이 테이블을 활용하여 노선별 총 누계 거리평균 역 사이 거리를 계산해야 합니다.

  • SUBWAY_DISTANCE 테이블
컬럼명  타입  설명
LINE VARCHAR(10) 호선명
NO NUMBER 순번
ROUTE VARCHAR(50) 노선 이름
STATION_NAME VARCHAR(100) 역 이름
D_BETWEEN_DIST NUMBER 역과 역 사이 거리 (km)
D_CUMULATIVE NUMBER 누적 거리 (km)

 

 

(문제출처: https://school.programmers.co.kr/learn/courses/30/lessons/284531?language=mysql )


 

🎯 입출력 예제

  • SUBWAY_DISTANCE 테이블
LINE NO ROUTE STATION_NAME D_BETWEEN_DIST D_CUMULATIVE
2호선 45 성수지선 용답 2.3 51.1
2호선 46 성수지선 신답 1 52.1
2호선 47 성수지선 용두(동대문구청) 0.9 53
2호선 48 성수지선 신설동 1.2 54.2
2호선 49 신정지선 도림천 1 55.2
2호선 50 신정지선 양천구청 1.7 56.9
2호선 51 신정지선 신정네거리 1.9 58.8
2호선 52 신정지선 까치산    
 


 

SQL을 실행하면 다음과 같이 출력되어야 합니다.

ROUTE TOTAL_DISTANCE AVERAGE_DISTANCE
신정지선 6km 1.5km
성수지선 5.4km 1.35km

 


 

🏆 핵심 포인트

문자열 정렬이라 잘못된 결과를 낼 수 있음 → 반드시 숫자 기준으로 정렬

 

 


 

📝 코드 구현

🔶 SUM(CODE)을 사용하는 이유

  • Front End는 JavaScript, React, Vue 등 여러 스킬로 이루어져 있음
    이들의 CODE를 SUM()하여 하나의 비트 마스크로 만들고,
    그 값과 & 연산을 하면 Front End 스킬 보유 여부를 한 번에 판별할 수 있습니다.

 

🔶  비트 연산자 &의 역할

  • &는 AND 비트 연산자로, 개발자의 스킬 코드에 특정 스킬이 포함되어 있는지를 판별합니다.
-- 노선별 총 누적 거리와 평균 역 사이 거리 계산
WITH TOTAL_DIS AS (
    SELECT
        ROUTE,  -- 노선명
        ROUND(SUM(D_BETWEEN_DIST), 1) AS TOTAL_DISTANCE,  -- 역 간 거리의 총합을 소수 첫째자리까지 반올림하여 '총 누적 거리' 계산
        ROUND(AVG(D_BETWEEN_DIST), 2) AS AVERAGE_DISTANCE  -- 역 간 거리의 평균을 소수 둘째자리까지 반올림하여 '평균 역 사이 거리' 계산
    FROM SUBWAY_DISTANCE
    GROUP BY ROUTE  -- 노선별로 그룹화
)

-- 최종 결과 출력
SELECT 
    A.ROUTE,  -- 노선명
    CONCAT(A.TOTAL_DISTANCE, 'km') AS TOTAL_DISTANCE,  -- 총 누적 거리에 'km' 단위 문자열 붙이기
    CONCAT(A.AVERAGE_DISTANCE, 'km') AS AVERAGE_DISTANCE  -- 평균 역 사이 거리에 'km' 단위 문자열 붙이기
FROM TOTAL_DIS A
ORDER BY A.TOTAL_DISTANCE DESC  -- 총 누적 거리 기준 내림차순 정렬

 

🔥 인사이트

🔹 결과값에 CONCAT()을 사용할 경우 SELECT절 다음 ORDER BY절 실행으로 인한 잘못된 정렬이 될 수 있음

-- 최종 결과 출력
SELECT 
    A.ROUTE,  
    CONCAT(A.TOTAL_DISTANCE, 'km') AS TOTAL_DISTANCE,  -- 총 누적 거리에 'km' 단위 문자열 붙이기
    CONCAT(A.AVERAGE_DISTANCE, 'km') AS AVERAGE_DISTANCE  -- 평균 역 사이 거리에 'km' 단위 문자열 붙이기
FROM TOTAL_DIS A
-- CONCAT() 전 값으로 정렬
ORDER BY A.TOTAL_DISTANCE DESC  -- 총 누적 거리 기준 내림차순 정렬