[25.03.10]본캠프 15일차 코드카타+python라이브세션+파이썬 종합

김명서·2025년 3월 10일
4

TIL_sparta

목록 보기
35/60

코드카타

20.정수 내림차순

def solution(n):
    answer = list(str(n))
    answer.sort(reverse=true)

정렬까진 한 것 같은데..int() 안에 리스트는 못들어간다고 에러가 떠서,
반환을 어떻게 해야하는지 서치해봤다..!

파이썬 내장함수

  • join (파이썬 종합 5-8강 참고(문자열결합))
    '구분자'.(리스트)
# 구분자를 안 넣었을 경우
test = ['Q', 'W', 'E', 'R']
print(''.join(test)) # QWER

# 구분자를 '*'로 넣었을 경우
test = ['Q', 'W', 'E', 'R']
print('*'.join(test)) # Q*W*E*R

# 구분자를 줄바꿈으로 넣었을 경우
test = ['Q', 'W', 'E', 'R']
print('\n'.join(test))
"""
Q
W
E
R
"""

참고링크

🔻그렇게 작성한 쿼리

def solution(n):
    answer=list(str(n))
    answer.sort(reverse=True)
    return int(''.join(answer))

꼭 True라고 작성해야한다. (T 꼭 대문자로)

이렇게 한줄로도 가능하다고한다 !

def solution(n):
    return int("".join(sorted(list(str(n)), reverse=True)))

.
.

21.하샤드수

하샤드수에 대한 정의가, 문제에 잘 설명되어있어서 조건을 바로 써줄 수 있었다.

❌만난 오류들
1. TypeError: 'int' object is not iterable
아 .. str로 자릿수 숫자를 분리해내고, sum을 해주려 했는데 8+1=81이 아니라 8+1=9를 할거니까 int로 바꿔줘야겠다.

  1. RecursionError: maximum recursion depth exceeded while getting the str of an object
    처음에 def solution(x)로 정의하고, 마지막에 return solution(x) 불러줘서 함수가 자기 자신을 계속 호출해서 무한 재귀가 발생하는 거라고 한다.
    어차피 true/false로 뱉어야하기때문에 불리언 변수 선언을 해줘야겠다 생각했다.

🔻

def solution(x):
    answer= x%sum([int(i) for i in str(x)])== 0
    return answer

다른 분들 풀이를 보니까, [ ]없어도 작동하는 것 같다.(실제로 그랬다)
반복해서 리스트에 저장(?)되어야 한다고 생각했던건데... 없어도 될것같기도하다
.
.


sql

74.특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
조건이 너무 많았다...
그중에서 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 이 조건을 처리하기 위해서 제일 애를 먹었다.

select a.car_id, a.car_type,a.fee
from (
    select c.car_id, c.car_type,
        round(((c.daily_fee*((100-p.discount_rate)/100))*30),0) as fee
    from CAR_RENTAL_COMPANY_CAR c
    join CAR_RENTAL_COMPANY_DISCOUNT_PLAN p
    on c.car_type=p.car_type
    where p.duration_type='30일 이상'
    and c.car_type in('세단','suv')
    ) a
join CAR_RENTAL_COMPANY_RENTAL_HISTORY h
on a.car_id=h.car_id
where a.fee between 500000 and 1999999
and (h.end_date<'2022-11-01')
group by 1
order by 3 desc, 2, 1 desc


처음 작성한 오답 쿼리이다. start_date 를 조회해봤을 때 다 11월 전이었어서, start_date에 대해서는 별다른 조건을 걸지 않았는데, 오답원인은 아래와 같다.

위 - 날짜 조건 없이 max date조회
아래 - end_date<'2022-11-01'걸고 max date 조회

🤦‍♀️

내가 처음에 작성한 쿼리는, 아래처럼 이미 날짜 조건을 걸었기 때문에 suv도 조회가 된거였을 것이다. 하지만 위 표를 보면 알 수 있듯이, suv들은 2022-11에 대여할 수 없다.
where문에 따로따로 걸면 그 두가지를 동시에 만족하는 것이 나와야하기 때문에, not in으로 푸는게 맞겠다. (아니면 where문 in(서브쿼리)에 조건을 두개걸거나.. )

해결방법
where문에서 not in 처리 (+별도 join없어도 됨)

🔻정답쿼리

select a.car_id, a.car_type,a.fee
from (
    select c.car_id, c.car_type,
        round(((c.daily_fee*((100-p.discount_rate)/100))*30),0) as fee
    from CAR_RENTAL_COMPANY_CAR c
    join CAR_RENTAL_COMPANY_DISCOUNT_PLAN p
    on c.car_type=p.car_type
    where p.duration_type='30일 이상'
    and c.car_type in('세단','suv')
    and c.car_id not in (select car_id
                         from CAR_RENTAL_COMPANY_RENTAL_HISTORY h
                         where h.end_date>'2022-11-01' and h.start_date<'2022-12-01')
    ) a
where a.fee between 500000 and 1999999
group by 1
order by 3 desc, 2, 1 desc

  1. 자동차 대여 기록 별 대여 금액 구하기
SELECT 
    h.history_id,
    CASE 
        WHEN DATEDIFF(h.end_date, h.start_date) + 1 >= 90 
            THEN ROUND(c.daily_fee * (DATEDIFF(h.end_date, h.start_date) + 1) * 0.90, 0)
        WHEN DATEDIFF(h.end_date, h.start_date) + 1 >= 30 
            THEN ROUND(c.daily_fee * (DATEDIFF(h.end_date, h.start_date) + 1) * 0.93, 0)
        WHEN DATEDIFF(h.end_date, h.start_date) + 1 >= 7 
            THEN ROUND(c.daily_fee * (DATEDIFF(h.end_date, h.start_date) + 1) * 0.95, 0)
        ELSE ROUND(c.daily_fee * (DATEDIFF(h.end_date, h.start_date) + 1)*1, 0)
    END AS fee
from CAR_RENTAL_COMPANY_CAR c
join CAR_RENTAL_COMPANY_RENTAL_HISTORY h
on c.car_id=h.car_id
join CAR_RENTAL_COMPANY_DISCOUNT_PLAN p
on c.car_type=p.car_type
where c.car_type='트럭'
group by 1
order by 2 desc, 1 desc

이렇게 작성했는데,
뭔가를 빼먹었나보다.. 너무 case when에서 끝내려고 욕심부렸나..
이정도 난이도가 되니까, 문법적오류가 있어서 실행이 안되는게 아니라 문법적 오류는 없어서 실행은 되는데 논리적 오류가 있는 것 같다...
다시 차근차근 생각해보는 연습을 해야겠다...................ㅠㅜ


python라이브세션

import pandas as pd
📢pandas 라는 라이브러리(모듈)를 호출(import) 하고 그 이름을 pd 로 줄여서 명명하겠다!

즉, pandas 라는 라이브러리 내 모든 함수를 불러온다.

라이브 러리 중 특정 함수만 사용하고 싶다면...

from matplotlib.pyplot as plt
matplotlib 의 pyplot 함수만 가져오고 이름을 plt 로 줄여서 명명하겠다!
.
.
.

# pandas 라이브러리를 활용한 csv 파일 읽기 
df = pd.read_csv("xxxx.csv")

# 테이블 확인하기 
display(df, df2, df3)

# 처음 5 줄만 출력하기 
#df2.head()

좀 더 파일 이리저리 보고싶은데... 코드카타에서 시간을 많이 써서, 오늘은 불러오는 것으로 마무리 ..!!


파이썬 종합

lambda 함수 ~ class까지 들었다.

✅filter와 map

filter와 map은 다른 분들의 풀이를 찾아보며 종종 봤어서 생소하진 않았지만, 자세히 어떤 역할을 해주는지는 몰랐다!! 람다와 함께 쓰인 예시로 배워서 더 실용적(?)이게 느껴졌고, 다음에 map을 사용한 다른 분의 풀이를 보면, 자세하게 이해할 수 있을 것 같다 ~!

✅glob, os 라이브러리

glob, os 라이브러리관련 내용도 실습해보고,

✅split, join

split, join에 대해서 학습했다. 이건 종종 쓰게될 것 같다..!

여기서 잠깐,

📌슬라이싱 vs split

나는 처음에 둘다 뭔가 자르는 느낌이라 헷갈렸다.
정리해보자면,

  • (문자열)슬라이싱은 시작지점의 위치부터 끝 지점의 위치까지 떼어온다
    ~~[x:y]
  • split함수는 문자열을 구분자 단위로 잘라 리스트 안에 넣어준다.
    ~~.split( )

✅class

class 도 잘 쓰면 유용할 것 같다 !! 파이썬에 좀 더 익숙해지면 써보기로...


느낀점&회고

예상치 못하게 sql코드카타에서 시간을 좀 써서, 오늘 맘껏 python을 만져보지 못했다 ㅠㅠ 금요일에 QCC가 있어서 sql을 절대 놓으면은 안될 것 같고 최대한 효율적으로 시간을 쓸 수 있도록 해야겠다. 오늘은 개인과제 기초단계(1,2번)만 풀었는데 다행히 쉽게 풀었다. 4일 더 열심히 공부해서 6,7,8 도전 문제도 잘 풀어서 제출하고싶다ㅏㅏㅏ🚀
포기하지말고 끝까지 풀어봐야겠다.

profile
경영학도의 데이터분석 성장기💥

0개의 댓글

관련 채용 정보