SQL 코드카타
문제 60
년, 월, 성별 별 상품 구매 회원 수 구하기
처음 답안
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
귤 고르기
처음 답안
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() 메서드는 리스트의 처음부터 끝까지 돌면서 개수를 세기 때문에 시간복잡도가 크다.
더보기
/