OkBublewrap

Maximize Prime Item Inventory 본문

개발/SQL

Maximize Prime Item Inventory

옥뽁뽁 2025. 3. 18. 13:02

Maximize Prime Item Inventory

문제

 

1. 평방피트: 500,000

2. prime_eligible 세트 평방비트: 68+85+8.5 = 161.5

3. not_prime 세트 평방비트: 49

4. prime_eligible을 먼저 채워야 함. 500,000 / 161.5 = 3095.98; prime_eligible 3095 세트 들어감

5. 남은 공간은 500,000(평방비트)  - (3095(세트 수) * 161.5(세트 평방비트)) = 157.5(평방비트)가 남음

6. not_prime을 나머지 공간을 채움 157.5 / 49 = 3.21; not_prime 3(세트)가 들어감

7. 각각 아이템 수와 세트를 곱한 값이 출력이 되어야 함.

item_type item_count
prime_eligible 3095 * 3 = 9285
not_prime 3 * 2 = 6

 

풀이

with prime_table as (
  SELECT 
    item_type, 
    sum(square_footage) as sum_footage,
    count(*) as cnt,
    floor(500000 / sum(square_footage)) as foot,
    500000 - sum(square_footage) * floor(500000 / sum(square_footage)) as blank,
    floor(500000 / sum(square_footage)) * count(*) as item_count
  FROM inventory
  where item_type = 'prime_eligible' 
  group by item_type
), 
not_prime as (
  SELECT 
    item_type,
    floor((select blank from prime_table) / sum(square_footage)) * count(*) as item_count
  from inventory
  where item_type = 'not_prime' 
  group by item_type
),
temp_01 as (
  select item_type, item_count
  from prime_table
  
  union 
  
  select item_type, item_count
  from not_prime
)
select *
from temp_01
order by item_count desc

 

접근 방식은 위에 설명 방식대로 순서대로 구하고 나머지를 구하는 그대로 풀었던 것 같다.

중간 중간 보면 필요없는 수식이 있다. 하나 하나 확인하면서 하느라 길게 늘어져있다.

그래서 이부분은 간단하게 풀이하고 다시 풀고 풀이를 작성할 것이다.

 

1️⃣ prime_table: item_type 그룹화, prime_eligible인 것만 item_count 구하기

2️⃣ not_prime: item_type 그룹화, not_prime만 item_count 구하기

3️⃣ union으로 테이블 합치기

4️⃣ 정렬

 

다시 풀기

with temp_01 as (
  select item_type, sum(square_footage) as sum_footage, count(*) as item_cnt
  from inventory
  group by item_type
)

select item_type,
  case 
    when item_type = 'prime_eligible' 
        then floor(500000 / sum_footage) * item_cnt
    when item_type = 'not_prime' 
        then 
        floor(
        (500000 - (
        select floor(500000 / sum_footage) * sum_footage 
        from temp_01 
        where item_type = 'prime_eligible')
        ) 
        / sum_footage
        ) * item_cnt
    end as item_count
from temp_01
order by 2 desc

1️⃣ CTE;temp_01: item_type별 그룹화, 총 평방피트, 아이템 수 계산

2️⃣ prime_eligible 세트: 아이템 수 구하기

500,000 평방피트 / prime_eligible 평방피트 = 들어갈 수 있는 최대 prime_eligible 세트 수

floor로 정수만 남기고 아이템 수 곱하기 = 총 들어간 아이템 수가 나옴!!

 

3️⃣ not_prime 세트: 아이템 수 구하기

이부분이 공식으로 구하기 어려운데 이 부분만 잘 계산식을 짠 뒤 코드를 작성을 하면 될 것 같다.

1. 남은 평방피트 가져오기. 서브쿼리 생성으로

temp_01 테이블에서 prime_eligible인 데이터를 가져오기

2. floor(500,000 / sum_footage): 최대로 들어갈 수 있는 세트

3. sum_footage: 한 세트 당 평방비트 

4. 2, 3을 곱하면 prime_eligible이 차지하는 평방비트가 나옴

5. 500,000에서 빼면 나머지 평방비트가 나옴

6. floor(위의 식) * item_count 하면 not_prime이 차지하는 아이템 수가 계산

 

4️⃣ 예제와 같이 아이템 수가 많은 곳으로 출력

 

 

'개발 > SQL' 카테고리의 다른 글

리텐션  (0) 2025.03.24
Median Google Search Frequency  (0) 2025.03.19
Server Utilization Time  (0) 2025.03.17
Repeated Payments  (0) 2025.03.16
날짜 함수, 쿼리 최적화  (0) 2025.03.16