THE STUFF OF THIS WEEK
1. 파이썬 : 코드카타 드디어 시작
전혀 손대지 못하고 아예 놓고 있었던 파이썬 코드카타를 드디어 시작했다.
SQL 코드카타와 달리, 파이썬 코드카타는 처음 문제가 올라온 뒤로 너무 어렵다고 생각해 전혀 건드리질 못하고 있었다. 그런데 분명 지난주에 조별 스몰토크를 할 때 마찬가지로 건드리질 못하겠다던 분이 문득 진도 레벨을 봐보니 레벨 2언저리에 다가가고 계신 것을 발견했고, 나라도 할 수 있지 않을까 하여 천천히 문제를 풀어보기로 결심. 문제 창을 들어가 보니 언어부터가 C? JAVA?로 설정이 되어 있단 걸 깨달았다.
물론 '질문하기'를 참고하면서 하긴 했지만, 그래도 문제를 풀다보니 생각보다 간단하게 풀리는 문제가 몇 있었다. 사칙연산은 그렇게 쉽게 넘어갔고, 이어서 나오는 문제들은 파이썬 심화 내용을 좀 더 배워야 할 것 같긴 하지만...일단은 드디어 스타트를 끊었다는 것에 의의를 두기로 했다. 후
#int() 함수 사용
def solution(num1, num2):
return int(num1/num2*1000)
#math.trunc() 사용
import math <-----------math 라이브러리 불러오기
def solution(num1, num2):
return math.trunc(num1/num2*1000)
int() 함수와 math 라이브러리의 대표적 함수들
함수 | 기능 |
int() | 정수 부분만 출력 |
math.trunc() | 정수 부분만 출력 |
math.floor() | 버림 |
math.ceil() | 올림 |
math.round() | 반올림 |
2. SQL : 막히던 코드카타 해결
2주전에 보고서 도저히 안 풀릴 것 같던 문제가 드디어 풀렸다. 날짜 비교에서 한 두번 막히고서 제대로 안 보면서 나중으로 미뤘던 문제였는데, 오늘 문득 보니 날짜 부분이 너무 간단하게 풀려버렸고, 그 뒤로는 술술 까진 아니어도 나름 막히지 않고 풀렸던 듯?
내용은 오늘자 TIL 복붙으로 갈음한다.
그래도 나 조금씩 성장하곤 있구나??
문제58. 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
서브쿼리 : 인라인뷰, LEFT OUTER JOIN, 스칼라쿼리, WITH 함수
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
2주 전쯤 시도했다가 아예 처음부터 막혀서 패스했다가, 다시 보니 드디어 풀려서 기록하는 문제.
날짜를 비교할 때 애초에 SQL이 'CHAR'이 아닌 'DATE'로 따로 인식하기에 2022-10-16와 같은 식으로 날짜를 그대로 입력만 해도 되는 줄 알고 전부터 몇 차례를 시도하다가 도통 되질 않아서 이미 수 차례를 포기했었다.
그러다가 '질문하기'의 답을 보니 공통적으로 따옴표가 필요하다는 것을 알게되고서 2주만에야 제대로된 문제풀이를 시도함....ㅠ
그래서 일단 직감대로 틀리든 말든 문제를 시도해보기로 했다.
오답
select distinct(car_id),
case when start_date <= '2022-10-16' and end_date>='2022-10-16' then '대여중'
else '대여가능' end availability
from car_rental_company_rental_history
order by car_id desc
우선 보자마자 마음 가는 대로 쓴 답변과 그에 따른 결과. 이미지에서 알 수 있듯, CAR_ID가 중복되어 나오고, 각 중복값마다 '대여 가능'과 '대여중'이 다르게 출력되었다는 것을 알 수 있다.
즉, 대여 기간 칼럼도 따로 SELECT 했다면, 각 CAR_ID의 모든 대여기록이 나왔을 것이다.
하지만 문제에서 원하는 것은 2022-10-16일을 기준으로 대여 가능 여부를 체크하는 것이니, 각 CAR_ID의 여러 대여 기록 중 해당 날짜에 겹치는 일정이 하나라도 있으면 '대여중', 그렇지 않으면 '대여 가능'을 출력하게 하는 것이 문제의 핵심이다.
'대여중'이 하나라도 있으면 그냥 '대여중'인 걸로 체크하는게 관건! 이를 위해 서브쿼리를 사용해야 한다.
정답
1)인라인뷰, LEFT OUTER JOIN 사용
select distinct(a.car_id),
if(b.car_id is not null, '대여중', '대여 가능') as availability
from car_rental_company_rental_history a
left outer Join
(select car_id
from car_rental_company_rental_history
where start_date <= '2022-10-16'
and end_date>='2022-10-16') b
on a.car_id = b.car_id
order by 1 desc
3. SQLD 강의 : 강의 완강
드디어 SQLD 강의 완료.
사전캠프 마지막 주부터 시작해서, 중간에 팀플과 여러 이유들로 인해 내내 끝내지 못하던 강의를 드디어 끝냈다.
이론 내용이다보니 많이 쳐져서.......중간중간 내용들을 많이 까먹고 복습해야할 것 같긴 한데
강의 자료 맨 뒤에 딸린 문제들 보니 생각보다 문제가 나쁘지 않게 풀리는 듯?
일단 팀원들이 공부한 김에 자격증까지 딸 생각이라는데 고민이다.
4. 새로운 조
-감기와 비염...등으로 이번 주 내내 다운되어 있어서 생각보다 많은 대화를 못해 아쉽지만....
공통분모를 이래저래 많이 찾았으니 이제 더 친해질 일만 남았음.
다음주(이번 주말부터)의 할 것들
-개인과제
-SQLD 강의 복습
-엑셀보다 쉬운 SQL, 데이터분석가 강의 주요 내용 복습
+SQL이고 파이썬이고 카타 내용을 좀 더 적극적으로 카운트해서 기록할 필요가 있을 듯 하다.