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

[본캠프 25일차] SQL 코드카타, 파이썬 코드카타, 기초 프로젝트 준비③

물맨두 2025. 3. 24. 14:57

 

오늘 한 일은,

  • SQL 공부
    • [코드카타] SQL 1문제 풀기 (99번)
  • 파이썬 공부
    • [코드카타] 알고리즘 1문제 풀기 (63번)
  • 기초 프로젝트 준비
    • 주말 동안 각자 EDA해온 것을 바탕으로 프로젝트 방향 구체화하기
    • 구매 건수에 기반한 고객 특성 파악하기

 

팀플: 기초 프로젝트 준비

굴리는 과정 보러가기:

 

[본캠프 25일차] 부록: [chap 2] 기초 프로젝트 준비②

[본캠프 24일차] 부록: [chap 2] 기초 프로젝트 준비①어제부터 주제를 정해서 기초 프로젝트 과제를 해나가고 있다. 어제도 하긴 했는데, 낡고 지친 관계로 어제 TIL에 해당 내용을 적지 못했다. 비

maandoo.tistory.com

 

 

우선 아침에 각자 주말 동안 더 구체화해 온 분석 방향을 나눠보고 오늘은 진짜 하나로 딱 프로젝트의 방향을 정하기로 했다. 

 

얘기하면서 고민되는 부분은 하나였다.

주어진 데이터를 보면 제품 추천 시스템을 구현해야 할 것 같은데, 그 방향으로 가기보다 transactions 테이블의 2019년 거래 내역만을 갖고 집계한 재구매 빈도를 바탕으로 고객 세그먼트를 진행해 해당 고객군의 특성에 따른 마케팅 전략을 수립하게 되면 주어진 articles 테이블을 많이 활용하지 못할 거란 점이 걸렸다. 그도 그럴 게 customers(6개)와 transactions(5개)에 비해 articles 테이블(25개)에 컬럼 수도 훨씬 많아 정보값이 더 많아서 artcles 테이블을 활용해 구매 내역을 바탕으로 추천 시스템을 구현해야 할 것만 같았다(...아닌가 kaggle competition에 사로잡혀 있는 건가).

 

그래서 조원들과 함께 튜터님께 찾아가 해당 부분에 대해 말씀 드리며 얘기를 나눈 결과 튜터님께서,

굳이 제품 추천 시스템 방향으로 프로젝트를 진행시키지 않아도 괜찮다.

그리고 주어진 테이블을 사용해 재구매 건수를 집계할 수 있다면 구매 건수를 바탕으로 프로젝트를 진행해도 될 것 같은데, transactions 테이블에서 2019년에 한해서 재구매를 집계할 수 있는 상황이니 해당 방향으로도 진행해도 괜찮을 듯하다.

또한 주어진 데이터들을 전부 활용할 필요가 없기도 하고 articles 테이블을 활용해 '구매 건수가 이러한 고객층은 주로 이런 제품군을 구매하더라' 하는 분석 방향으로도 접근할 수 있으니 articles 테이블을 활용하는 수준에 대해 너무 신경 쓰지 않아도 좋을 듯하다

하는 답변을 받아서 구매 건수에 따라 고객군을 세그먼트하고 각 고객군에 따라 프로모션을 달리 진행하는 방향으로 가닥을 잡았다.

 

(출처: 내 티스토리 "[본캠프 24일차] 부록: [chap 2] 기초 프로젝트 준비①")

아무튼, 오늘은 주말 동안 문제 방향을 잡아놓은 대로 가기로 오전에 정해진 만큼 그 방향으로 좀 더 구체적으로 구매 건수에 따른 고객군의 특성을 분석해보려 pandas와 matplotlib으로 다시 또 데이터를 이리저리 굴려봤다.


 

 SQL 공부: [코드카타] SQL 문제 풀기 (99번)

99. (2365) Number of Unique Subjects Taught by Each Teacher

Write a solution to calculate the number of unique subjects each teacher teaches in the university.
Return the result table in any order.

SELECT teacher_id,
       COUNT(DISTINCT subject_id) cnt
FROM Teacher
GROUP BY teacher_id

오늘 문제는 오랜만에 리트코드가 알려주는 문제 난이도와 나의 체감 난이도가 일치하는 easy한 문제였다. 

teacher_id별로 subject_id를 집계하는 문제라 위와 같이 제출해 한 번에 통과됐다.


 

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

63. 숫자 짝꿍

두 정수 XY의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). XY의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. XY의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.
예를 들어,X= 3403이고Y= 13203이라면,XY의 짝꿍은XY에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로X= 5525이고Y= 1255이면XY의 짝꿍은XY에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개,Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수X,Y가 주어졌을 때,X,Y
의 짝꿍을 return하는 solution 함수를 완성해주세요.

# 63번 문제 - 첫 번째 시도 코드 (틀림 처리. '00'을 '0'으로 출력하지 못함)

def solution(X, Y):
    answer = ''
    x, y = str(X), str(Y) # 정수를 문자열로 변환
    counter_x = {} # 문자열 x에서 등장하는 문자숫자와 그 숫자가 등장하는 횟수를 딕셔너리 형태로 저장할 것임
    
    for i in x: # 문자열 x에 대해서 
        if i in counter_x: # counter_x 딕셔너리에 이미 i가 있다면 해당 글자의 value값에 1을 더해줌
            counter_x[i] = counter_x[i]+1
        else:
            counter_x[i] = 1 # counter_x 딕셔너리에 i가 없다면 값을 추가(i:1의 형식으로)
        
    for j in y: # 문자열 y에 대해서
        if j in counter_x: # j가 counter_x에 있다면
            answer += j # answer에 j를 추가하고
            counter_x[j] = counter_x[j]-1 # counter_x에서 value값을 1회 차감함
            if counter_x[j] == 0: # 이때 만약 value값이 0이라면 
                counter_x.pop(j, None) # 해당 값(j:0)을 counter_x에서 제거함
    
    if len(answer) == 0: #answer에 담긴 글자가 없다면(=X와 Y에 공통 숫자가 없음)
        answer = '-1' # -1을 반환
    else:
        answer = ''.join(sorted(answer, reverse=True)) # answer에 담긴 문자숫자들을 내림차순으로 정렬해서 반환
    
    return answer

위와 같이 코드를 작성하니 테스트 2의 경우에서 기댓값과 다른 결과값을 도출하며 틀리게 된다. 이 경우 주어진 정수가 100과 203045로 공통 숫자는 00이나 사실 00은 숫자 0과 다름없기에 0으로 반환해야 하는 듯 하다.

 

# 63번 문제 - 두 번째 시도 코드 (정답 처리)

def solution(X, Y):
    answer = ''
    x, y = str(X), str(Y)
    counter_x = {}
    
    for i in x:
        if i in counter_x:
            counter_x[i] = counter_x[i]+1
        else:
            counter_x[i] = 1
        
    for j in y:
        if j in counter_x:
            answer += j
            counter_x[j] = counter_x[j]-1
            if counter_x[j] == 0:
                counter_x.pop(j, None)
    
    if len(answer) == 0:
        answer = '-1'
    else:
        answer = ''.join(sorted(answer, reverse=True))
        if answer.count('0') == len(answer): # answer의 길이와 answer 속 '0'의 개수가 일치할 때(=answer가 0만으로 이뤄짐)
            answer = '0' # answer는 '0'
    return answer

코드가 줄줄 엄청 길어졌지만 다행히도 통과됐다... 남들의 정답 코드를 확인해야 하는데, 팀플 과제하러 가야 한다..... 터덜터덜..