본문 바로가기

WIL

1/26 WIL

이번주 주요 공부

 

날짜(date_sub) 활용

문제 98. Game Play Analysis IV - LeetCode

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Write a solution to report the fraction of players that logged in again on the day after the day they first logged in, rounded to 2 decimal places. In other words, you need to count the number of players that logged in for at least two consecutive days starting from their first login date, then divide that number by the total number of players.

The result format is in the following example.

 

 

오답

select if(min(event_id)-max(event_id) = 1, 1, 0)
from acitivity
where event_date in (select event_date
                    from activtiy
                    group by player_id
                    order by 1 asc
                    limit 2)
group by player_id

 

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

what the...

 

 

정답

select round(count(distinct player_id)/(select count(distinct player_id) from activity), 2) as fraction
from activity				--(2)의 날짜가 있는 id를 구해주고 전체 id로 나눠줌
where (player_id, date_sub(event_date, interval 1 day))    --최초 접속일로부터 하루 지난뒤(2)
     in (
         select player_id,
                min(event_date) as first_login             --가장 빠른 날짜(최초접속일)(1)
         from Activity
         group by player_id)

사실 지금까지 공부했던 함수를 통해서 풀려면 아예 못 풀 문제는 아닌 것 같긴 하지만, 유형 자체를 처음 접하는 거라 결국 solution들을 볼 수밖에 없었던 문제.

최초 날짜와 두번째 날짜를 비교하는 문제라 윈도우 함수 같은 것을 써야하나 싶었지만, 최초 날짜 다음 날이 있는지 확인해주는 것만으로도 해결 가능한 문제였다.

날짜 활용 심화 문제인 것 같아서 기억해두면 좋을 듯!

 

 

 

 

문제101. 1070. Product Sales Analysis III : where in 심화 

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Write a solution to select the product id, year, quantity, and price for the first year of every product sold.

Return the resulting table in any order.

The result format is in the following example.

 

 

오답

select s.product_id,
       s.year as first_year,
       s.quantity,
       s.price
from sales s join product p using(product_id)
where s.year in (select min(year)
                from sales
                group by product_id)
group by product_id

 

처음 썼던 오답. where in과 min()을 통해 최초 년도를 잡아줬고 처음 제시된 case에서는 답이 맞다고 떴는데

그 외의 예제에서 오답이 떠서 틀렸다.

이래저래 생각해보니 where 절에 year만 잡아줘서 최초년도가 잡히고, 그게 또 본 쿼리의 group by와 이상하게 섞여서 날짜와 product_id가 이상하게 매칭이 됐던 모양.

 

정답

select product_id,
       year as first_year,
       quantity,
       price
from sales
where (product_id, year) in
                (select product_id ,min(year)
                from sales
                group by product_id)

정답이라 생각하고 초반에 본 쿼리에다가 group by product_id를 넣어줬었는데 오답이라고 떴다.

굳이 안 넣어줘도 되긴 하지만 그런다고 틀린 건 아니지 않은가?(육안상 expected result와 output이 다르진 않았다)

아무튼 where절로 최솟값/최댓값 등과 더불어 그와 상응하는 case의 데이터를 추출할 때엔 해당 데이터의 칼럼도 언급해주어야만 한다.

 

 

문제 110. 1164. Product Price at a Given Date  :   where, union, distint 활용

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Write a solution to find the prices of all products on 2019-08-16. Assume the price of all products before any change is 10.

Return the result table in any order.

The result format is in the following example.

 

Input
Products =
| product_id | new_price | change_date |
| ---------- | --------- | ----------- |
| 1          | 20        | 2019-08-14  |
| 2          | 50        | 2019-08-14  |
| 1          | 30        | 2019-08-15  |
| 1          | 35        | 2019-08-16  |
| 2          | 65        | 2019-08-17  |
| 3          | 20        | 2019-08-18  |

 

최종 정답

select product_id,
       new_price as price
from products
where (product_id, change_date) in 
                     (select product_id, max(change_date)
                      from products
                      where change_date <= '2019-08-16'
                      group by product_id)
union
select product_id,
       10 as price
from products
where product_id not in (select distinct product_id
                        from Products
                        where change_date <='2019-08-16')

 

 

 

여기서 포인트는 distinct 함수

select distinct product_id
from Products
where change_date <='2019-08-16'
| product_id |
| ---------- |
| 1          |
| 2          |

group by로 필터링할 생각만 했기 때문에 이 부분이 제일 어려웠고 헤맸던 부분인데, distinct로 간단하게 해결 할 수 있는 문제였다. 즉, 각 product_id가 한 번이라도 8/16 전에 언급되기만 하면 위 쿼리로 그 결과값을 출력해낼 수 있으므로, 

 

포인트

  • 중복되는 유닛 단위로 필터링 해야한다고 해서 그룹화가 무조건 답은 아님
  • 그룹화를 통한 필터링이 막힐 때에는 distinct를 사용할 것

 

파이썬 카타

 

문제 9. 짝수의 합 : 리스트와 반복문 활용

정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.

def solution(n):
    sum = 0
    for a in range(0, n+1, 2):
        if a%2 == 0:
            sum = sum+a
    return sum

이전에 풀었던 문제긴 하지만, 잠시 헷갈렸기에 복기.

그리고 더 간단하게 풀 수 있는 방법이 없나 싶어서 일단 작성해보고 다른 정답들을 봐보기로 했다.

 

오답

def solution(n):
    return sum((for i in range(0, n+1, 2))

다른 정답들을 보고서 작성해본 코드. 바로 오답이 났다.

 

정답

def solution(n):
    return sum([i for i in range(0, n+1, 2)])   # 리스트 생성 시, 반복문 앞에 구성요소인 i 언급

*정답 주요 포인트

  • sum은 list에 대한 함수임.
  • 반복문으로 리스트를 만들 때 반복문의 구성요소를 반복문 앞에서 따로 언급해주어야 함!

 

 

 

TMI

-이번 주 내내 밤에 잠도 잘 안 오고, 그러면서 또 낮에는 졸립고 집중도 잘 안 됐는데...점심 때 운동을 무리한 탓인가? 내배캠 시작하고서 내내 운동을 애매하게 했어서 이제부터라도 좀 본격적으로 해볼까했는데 넘 고민이다.

-전혀 생각한 적 없었는데 얼떨결에 ADsP 자격증 시험 신청함. 토익 텝스 말고 공인 시험 본 적 없는데..이렇게 될 줄이야ㅋㅋ 기왕 열심히 해봐야지

-이번 조는 하면서 배울게 많을 것 같다. 여러모로 기대중

'WIL' 카테고리의 다른 글

02/08 WIL - 심화 프로젝트 1주차  (0) 2024.02.08
WIL 02/02  (0) 2024.02.02
1/12 WIL  (1) 2024.01.12
01/05  (0) 2024.01.05
12월 마지막주(12/29) WIL  (0) 2023.12.29