[내일배움캠프] 데이터 트랙/본 캠프

[내일배움캠프] 주말 공부 - SQL 코드카타, Python 알고리즘 코드카타

554083460 2025. 6. 22. 22:40



 

 SQL 코드카타

 

 

문제 60

년, 월, 성별 별 상품 구매 회원 수 구하기

 

☑ link

 

 

처음 답안

SELECT a.YEAR,
       a.MONTH,
       a.GENDER,
       COUNT(*) USER  -- COUNT(*)
FROM
(
SELECT YEAR(O.SALES_DATE) YEAR,
       MONTH(O.SALES_DATE) MONTH,
       U.GENDER,
       U.USER_ID
FROM USER_INFO U
JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
WHERE U.GENDER IS NOT NULL
) a
GROUP BY YEAR, MONTH, GENDER 
ORDER BY YEAR, MONTH, GENDER

 

최종 답안

SELECT a.YEAR,
       a.MONTH,
       a.GENDER,
       COUNT(DISTINCT a.USER_ID) USER  -- COUNT(DISTINCT a.USER_ID)
FROM
(
SELECT YEAR(O.SALES_DATE) YEAR,
       MONTH(O.SALES_DATE) MONTH,
       U.GENDER,
       U.USER_ID
FROM USER_INFO U
JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
WHERE U.GENDER IS NOT NULL
) a
GROUP BY YEAR, MONTH, GENDER 
ORDER BY YEAR, MONTH, GENDER

 

 

틀린 이유 

 

구매 회원 수를 집계할 때, COUNT(*)을 사용함

→ 같은 연도, 같은 달에 한 회원이 여러 번 구매했을 수도 있다

→ 구매 7번이더라도, 고유한 회원은 1명

→ 이때 COUNT(*)을 사용하면 7번으로 집계된다

 

 

개선점

 

COUNT로 전체 수 집계하기

  • COUNT(*)
    전체 ROW 세기
  • COUNT(DISTINCT user_id)
    고유한 user_id만 세기

 

 

 

 Python 알고리즘 코드카타

 

 

문제 83

귤 고르기

 

☑ link

 

 

처음 답안

def solution(k, tangerine):
    num = []
    for i in tangerine:
        num.append(tangerine.count(i))  # count(i) 부분이 시간복잡도 증가시킴
    num.sort(reverse=True)
    answer = 0
    for i in num:
        if i >= k:
            answer += 1
            break
        else:
            answer += 1
            k = k - i
    return answer

 

최종 답안

from collections import Counter  # collections.Counter 사용
 
def solution(k, tangerine):
    count = Counter(tangerine)
    count = list(count.values())
    count.sort(reverse=True)
    answer = 0
    for i in count:
        if i >= k:
            answer += 1
            break
        else:
            answer += 1
            k = k - i
    return answer

 

 

틀린 이유 

 

1. 리스트에 .count() 메서드를 사용해 시간 복잡도가 증가하여 시간초과로 틀렸다.

 

 

새롭게 알게 된 것

 

1. collections.Counter

  • collections 모듈의 Counter 클래스
  • Counter(iterable)은 iterable의 원소가 몇 개인지 센 결과를 딕셔너리로 반환한다.
count = Counter(iterable)  # iterable의 원소 i가 몇 개 들어있는지 세기
count = list(count.values())  # 센 값만 리스트로 반환
  • Counter 클래스는 시간복잡도 면에서 리스트 .count() 메서드보다 유리하다.
  • 리스트의 .count() 메서드는 리스트의 처음부터 끝까지 돌면서 개수를 세기 때문에 시간복잡도가 크다.