20.정수 내림차순
def solution(n):
answer = list(str(n))
answer.sort(reverse=true)
정렬까진 한 것 같은데..int() 안에 리스트는 못들어간다고 에러가 떠서,
반환을 어떻게 해야하는지 서치해봤다..!
파이썬 내장함수
'구분자'.(리스트)
# 구분자를 안 넣었을 경우
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로 바꿔줘야겠다.
RecursionError: maximum recursion depth exceeded while getting the str of an object
🔻
def solution(x):
answer= x%sum([int(i) for i in str(x)])== 0
return answer
다른 분들 풀이를 보니까, [ ]
없어도 작동하는 것 같다.(실제로 그랬다)
반복해서 리스트에 저장(?)되어야 한다고 생각했던건데... 없어도 될것같기도하다
.
.
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
- 자동차 대여 기록 별 대여 금액 구하기
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에서 끝내려고 욕심부렸나..
이정도 난이도가 되니까, 문법적오류가 있어서 실행이 안되는게 아니라 문법적 오류는 없어서 실행은 되는데 논리적 오류가 있는 것 같다...
다시 차근차근 생각해보는 연습을 해야겠다...................ㅠㅜ
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은 다른 분들의 풀이를 찾아보며 종종 봤어서 생소하진 않았지만, 자세히 어떤 역할을 해주는지는 몰랐다!! 람다와 함께 쓰인 예시로 배워서 더 실용적(?)이게 느껴졌고, 다음에 map을 사용한 다른 분의 풀이를 보면, 자세하게 이해할 수 있을 것 같다 ~!
glob, os 라이브러리관련 내용도 실습해보고,
split, join에 대해서 학습했다. 이건 종종 쓰게될 것 같다..!
여기서 잠깐,
📌슬라이싱 vs split
나는 처음에 둘다 뭔가 자르는 느낌이라 헷갈렸다.
정리해보자면,
- (문자열)슬라이싱은 시작지점의 위치부터 끝 지점의 위치까지 떼어온다
~~[x:y]
- split함수는 문자열을 구분자 단위로 잘라 리스트 안에 넣어준다.
~~.split( )
class 도 잘 쓰면 유용할 것 같다 !! 파이썬에 좀 더 익숙해지면 써보기로...
예상치 못하게 sql코드카타에서 시간을 좀 써서, 오늘 맘껏 python을 만져보지 못했다 ㅠㅠ 금요일에 QCC가 있어서 sql을 절대 놓으면은 안될 것 같고 최대한 효율적으로 시간을 쓸 수 있도록 해야겠다. 오늘은 개인과제 기초단계(1,2번)만 풀었는데 다행히 쉽게 풀었다. 4일 더 열심히 공부해서 6,7,8 도전 문제도 잘 풀어서 제출하고싶다ㅏㅏㅏ🚀
포기하지말고 끝까지 풀어봐야겠다.