일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 티스토리챌린지
- 미세먼지
- harkerrank
- 텍스트 분석
- 파이썬 철저입문
- 내일배움
- SQL
- 프로그래머스
- 파이썬 철저 입문
- 중회귀모형
- Cluster
- 회귀분석
- 파이썬
- 내일배움카드
- R
- 파이썬 머신러닝 완벽가이드
- 내일배움캠프
- 실전 데이터 분석 프로젝트
- 파이썬 머신러닝 완벽 가이드
- 어쩌다 마케팅
- 스파르타
- 스파르타코딩
- wil
- 프로젝트
- 웹 스크랩핑
- hackerrank
- MySQL
- 스파르타 코딩
- TiL
- 오블완
- Today
- Total
OkBublewrap
Maximize Prime Item Inventory 본문
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 |