[SQL]_코드카타_111번~113번

JIYUU·2025년 9월 28일

111번

문제

버스를 타기 위해 사람들이 줄을 서 있습니다. 하지만 버스에는 1000킬로그램의 무게 제한이 있어서 일부 사람들은 탑승하지 못할 수도 있습니다.

무게 제한을 초과하지 않고 버스에 탈 수 있는 마지막 사람의 이름(person_name)을 찾는 해결책을 작성하세요.

테스트 케이스는 첫 번째 사람이 무게 제한을 초과하지 않도록 생성됩니다.

주의할 점은 한 번에 한 사람씩만 버스에 탈 수 있다는 것입니다.

결과 형식은 다음 예시와 같습니다.

Input:
Queue table:

person_idperson_nameweightturn
5Alice2501
4Bob1755
3Alex3502
6John Cena4003
1Winston5006
2Marie2004

Output:

person_name
John Cena

Explanation: The folowing table is ordered by the turn for simplicity.

TurnIDNameWeightTotal Weight
15Alice250250
23Alex350600
36John Cena4001000
42Marie2001200
54Bob175___
61Winston500___

누적합이 1000 이하가 되는 사람의 이름을 출력하는 문제다.
SUM() OVER를 사용한 뒤에, 누적합이 1000을 넘지 않는 사람들 중에서 가장 마지막 사람의 이름을 ORDER BY와 LIMIT을 활용해서 추출했다.

SELECT person_name
FROM
(
    SELECT person_name, SUM(weight) over(order by turn) as total_weight
    FROM Queue
) as total
WHERE total_weight <= 1000
ORDER BY total_weight DESC LIMIT 1;

112번

문제

각 급여 구간(salary category)별 은행 계좌 수를 계산하는 해결책을 작성하세요.

급여 구간은 다음과 같습니다:

"Low Salary": 20,000 미만의 모든 급여

"Average Salary": 20,000 이상 50,000 이하의 모든 급여

"High Salary": 50,000 초과의 모든 급여

결과 테이블에는 세 가지 카테고리가 모두 포함되어야 합니다. 특정 카테고리에 속하는 계좌가 없을 경우 0을 반환하세요.

결과 테이블은 어떤 순서로 반환해도 상관없습니다.

결과 형식은 다음 예시와 같습니다.

Input: Accounts table

account_idincome
3108939
212747
887709
691796

Output

categoryaccounts_count
Low Salary1
Average Salary0
High Salary3

모든 카테고리가 반환되어야 하는게 핵심이다.
따라서 category를 만들어준 뒤, union all로 각각의 카테고리를 병합하는 방식으로 진행한다.

SELECT 'Low Salary' AS category,
       SUM(CASE WHEN income < 20000 THEN 1 ELSE 0 END) AS accounts_count
FROM Accounts
UNION ALL
SELECT 'Average Salary',
       SUM(CASE WHEN income BETWEEN 20000 AND 50000 THEN 1 ELSE 0 END)
FROM Accounts
UNION ALL
SELECT 'High Salary',
       SUM(CASE WHEN income > 50000 THEN 1 ELSE 0 END)
FROM Accounts;

113번

문제

월급이 30,000 미만이고, 동시에 자신의 매니저가 회사를 떠난 직원들의 ID를 찾으세요.

매니저가 회사를 떠나면 Employees 테이블에서 그 매니저의 정보는 삭제되지만, 해당 매니저를 보고하던 직원들의 manager_id 값은 여전히 그 떠난 매니저로 설정되어 있습니다.

결과 테이블은 employee_id 기준으로 정렬해야 합니다.

결과 형식은 아래 예시와 같습니다.

Input: Employees table

employee_idnamemanager_idsalary
3Mila960301
12Antonellanull31000
13Emerynull67084
1Kalel1121241
9Mikaelanull50937
11Joziah628485

Output

employee_id
11

해당 문제의 조건은 다음과 같다.
1. Salary가 30000 미만이다.
2. 매니저의 아이디(manager_id)가 해당 테이블에 존재하지 않는다.

SELECT employee_id
FROM Employees e
WHERE NOT EXISTS (
    SELECT 1
    FROM Employees a
    WHERE a.employee_id = e.manager_id
) AND salary < 30000 AND e.manager_id IS NOT NULL 
ORDER BY employee_id;

문제를 이렇게 풀었으나,
더 간단한 풀이법은 다음과 같다.

SELECT employee_id
FROM Employees
WHERE salary < 30000
AND manager_id NOT IN (
  SELECT employee_id FROM Employees
)
ORDER BY employee_id;

보자마자 NOT EXISTS밖에 생각나지 않아서, NOT IN을 생각하지 못했다.

급여가 30,000 미만이면서, manager_id가 employee_id에 없는 즉, 관리자가 테이블에 존재하지 않는 경우를 가져오는 쿼리문이다.

0개의 댓글