[내배캠] 데이터분석 6기/본캠프 기록

[본캠프 18일차] SQL 코드카타, 파이썬 공부

물맨두 2025. 3. 13. 22:51

 

어제 공지방에 오늘 발제 있대서 쫄았는데 추가적으로 과제가 생기는 일은 없었다. 다행이다. 

 


어제 저녁에 전에 노트북 신청했던 게 드디어 담당 매니저님에게서 연락이 왔고 계약서 작성 완료했다🎉 (마참내!!) 오늘부터 배송하니까 아마 주말 중에도 받을 있을지도 모른다. 드디어 다음 주엔 새로운 맥북과 함께 학습할 수 있겠다.

(👇 노트북 신청한 날의 TIL 보러 가기 👇 )

 

[본캠프 3일차] SQL 코드카타, 파이썬 코드카타, MySQL 설치, ADsP 공부

오늘은 알람이 울리기도 전에 눈이 떠졌다. 15분 더 못 잔 게 아쉽지만 그냥 일어났다.근데 알람이 일어나기도 전에 스스로 일어났으면서 왜 피곤한 거지? 오늘 이것저것 많이 했는데 가장 빅 이

maandoo.tistory.com

 

250312 데일리 스크럼 중 오후 스크럼 때 정리한 내용

그리고 어제 코드카타 SQL문제를 풀면서 이젠 하루에 2문제씩 풀기로 일일 목표량을 수정했다. 파이썬은 원래부터 낯설고 어려웠지만 SQL은 60번대 후반부터 문제가 까다로워지면서 푸는 데 더 많은 시간을 소요하게 되면서 이렇게 조정하게 됐다. 그래서 이젠 SQL은 2문제씩, 알고리즘은 1문제씩 풀어나갈 계획이다.


 

오늘 한 일은, 

  • SQL 공부
    • [코드카타] SQL 2문제10문제 풀기 (76~77번)(76~85번)
  • 파이썬 공부
    • [코드카타] 알고리즘 1문제 풀기 (56번)
    • [라이브 세션] 파이썬 3회차 수강하기
    • [파이썬 종합반] 4주차 수강하기
    • 파이썬 개인 과제 7~8번 풀기

 

SQL 공부: [코드카타] SQL 문제 풀기(76~77번)(76~85번)

사실 오늘 분량은 76번부터 77번까지이긴 했는데 77번부터 문제를 푸는 사이트가 달라지면서(프로그래머스→LeetCode)로 바뀌면서 다시 난이도가 1번의 수준으로 내려갔다. 그래서 85번까지 풀어서 10문제를 풀었다. 내일 QCC이니까 SQL 공부도 한다 생각하고 쉬운 문제는 빨리 쳐내기 위해서 겸사겸사~

76. 상품을 구매한 회원 비율 구하기

USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두 번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

--76번 제출한 쿼리
SELECT YEAR(sales_date) year,
       MONTH(sales_date) month,
       COUNT(DISTINCT user_id) purchased_users,
       ROUND(COUNT(DISTINCT user_id) / (SELECT COUNT(*) FROM user_info WHERE YEAR(joined) = '2021'), 1) purchased_ratio
FROM online_sale
WHERE user_id IN (
    SELECT user_id
    FROM user_info
    WHERE joined LIKE '2021-%')
GROUP BY year, month
ORDER BY year, month

처음에 보고 그렇게 어렵진 않겠다 싶었는데 purchased_ratio를 구할 때 필요한 "2021년에 가입한 전체 회원 수"를 어떻게 작성해야 하나를 골몰하는 데 많은 시간이 들었다. WITH 구문으로 user_info 테이블을 어떻게 조작도 해보고, 윈도우 함수로 전체 회원수를 구해놓은 상태에서 user_info 테이블과 online_sale 테이블을 JOIN해보려다가 막히고 등등 참… 하나가 되면 다른 하나가 뜻대로 되질 않아서 험난했다.

 

그러다가 서브쿼리에 대한 글을 보다가 스칼라 서브쿼리로 될 것 같았다가 안 될 것 같기도 하고 아리까리했다. 안 될 것 같았던 것은 GROUP BY절에 purchased_ratio컬럼이 포함이 안 되지 않나 순간 헷갈렸기 때문이다. 그렇지만 purchased_ratio 컬럼도 계산할 때 분자로 purchased_users를 구한 것과 같이 계산해줘야 하기 때문에 특별히 에러가 발생하지 않고 계산할 수 있었다.

(197) Rising Temperature

Write a solution to find all dates' id with higher temperatures compared to its previous dates (yesterday).
Return the result table in any order
.

--85번 첫 번째 쿼리
SELECT a.id
FROM (
    SELECT *,
        LAG(temperature) OVER(ORDER BY recordDate) yesterday_temp
    FROM weather
    ORDER BY recordDate
    ) a 
WHERE a.temperature > a.yesterday_temp

첫 번째 쿼리로 작성해서 제출했더니 전날 데이터가 없는 경우는 NULL값으로 조회돼야 하는데 그렇지 않아서 틀렸다고 떴다. (프로그래머스보다 뭐 때문에 틀렸다고 띄워주니까 왜 틀렸는지 답답한 건 덜한 것 같다. 아닌가, 아직 문제가 쉬워서 그런가)

 

--두 번째 쿼리 (정답 처리됨)
SELECT w1.id
FROM weather w1 --w1이 오늘
	INNER JOIN weather w2 --w2가 어제
    ON w1.recordDate = DATE_ADD(w2.recordDate, INTERVAL 1 DAY)
WHERE w1.temperature > w2.temperature

이게 난이도 easy..? 뭔가 쿼리를 적고 나니 간단해보이는데 꽤나 헤맸다.

 


 

파이썬 공부①: [코드카타] 알고리즘 문제 풀기(56번)

56. 과일 장수

#56번 첫 번째 코드
def solution(k, m, score):
    answer = 0
    score.sort(reverse = True) #내림차순으로 score 리스트를 정렬
    box_cnt = len(score) // m #사과 상자 몇 개 만들 수 있는지 구함
    
    while box_cnt > 0: # 더 이상 사과 상자를 만들 수 없을 때까지 이하의 내용을 반복
        box = score[:m] #한 상자에는 사과를 m개 담음
        answer += min(box) * m #answer에 한 상자의 가격을 구해 더함
        for i in box: #score에서 방금 상자를 계산하는 데 사용한 점수들은 삭제함
            score.remove(i)
        box_cnt -= 1 #box_cnt에서 한 상자를 차감
    return answer

테스트 케이스는 통과했는제 제출했더니 24개의 케이스 중 5개에서 시간 초과로 에러가 떴다.

뭐지..? while문이니 어디선가 무한 반복되다가 이런 일이 발생한 걸까.

음 아니다. for문으로 바꿔줘도 똑같은 경우에 똑같은 에러가 난다.

 

그러면 그 하위 코드 블록에서 문제가 발생하는 것 같은데 사실 어디서 틀렸는지는 감도 안 와서 지금 적어놓은 것보다 더 단순하게 수정해보기로 한다.

어떤 식으로 계산하는지 보기 위해 샘플 케이스를 어떤 식으로 연산하는지 중간에 내림차순 정렬된 score 리스트와 answer에 더해지는 순서를 보았다.

 

  • 테스트 1: 8 = 2*4
  • 테스트 2: 33 = 4*3 +4*3 + 2*3 + 1*3

내림차순으로 정렬한 score 리스트에서 m 간격의 값에 m을 곱한 갑들을 더하고 있었다.

def solution(k, m, score):
    answer = 0
    score.sort(reverse = True)
    
    for b in range(0, len(score), m):
        if len(score[b:b+m]) == m:
            answer += min(score[b:b+m]) * m
    return answer

그래서 그 정보를 이용해서 이런 식으로 코드를 수정했다.

 


 

오늘 진짜 집중력 고장난 거 같다. 우선 일찍 자는 게 낫겠어… 주말에 좀 더 하는 한이 있더라도…