2024-10-20

Suhyeon Lee·2024년 10월 19일
0

CodeKata

SQL

63. 자동차 평균 대여 기간 구하기

  • 작성 쿼리
SELECT
  car_id
  , ROUND(AVG((DATEDIFF(end_date, start_date)+1)), 1) AS average_duraton
FROM
  car_rental_company_rental_history
GROUP BY
  car_id
HAVING
  ROUND(AVG((DATEDIFF(end_date, start_date)+1)), 1) >= 7
ORDER BY
  2 DESC
  , 1 DESC
;
  • WITH문 연습할 겸 추가 작성
WITH temp AS (
  SELECT
    car_id
    , AVG(DATEDIFF(end_date, start_date) + 1) AS average_duration
  FROM
    car_rental_company_rental_history
  GROUP BY
    car_id
  HAVING
    AVG(DATEDIFF(end_date, start_date) + 1) >= 7
)
SELECT
  car_id
  , ROUND(average_duration, 1) AS average_duration
FROM
  temp
ORDER BY
  2 DESC
  , 1 DESC
;

문제 핵심 
(1) 날짜 계산 함수 사용 
end_date - start_date를 하면 원하는 날짜 차이가 나오지 않음 → 두 기간 사이의 일수 계산을 계산해주는 DATEDIFF() 함수를 사용  
DATEDIFF(종료날짜, 시작날짜)
날짜 포맷에 시간이 포함되어 있는 경우 시간은 계산에 포함하지 않고, 날짜 범위에서 벗어나는 값을 입력하는 경우 NULL을 반환
(2) DATEDIFF() 결과 + 1
대여한 날에 바로 반납했을 경우(e.g. start_date: '2024-09-09', end_date: '2024-09-09') DATEDIFF(end_date, start_date) 결과는 0이지만 실제로는 오늘 빌려서 오늘 반납할 경우 대여기간을 1로 계산하기 때문에 DATEDIFF() 결과값에 +1을 해 주어야 함

※ 그냥 -를 하면 2022-01-27은 20220127이라는 숫자로 계산이 되어서 실제로는 5일 차이인 2022-02-01이 20220201이라는 숫자로 계산이 되고 20220201 - 20220127 의 결과인 74가 나옴

HAVING절에 alias 안 쓴 이유

Python

15. 나머지가 1이 되는 수 찾기

  • 작성 코드
def solution(n):
    for i in range(2, n):
        if n%i == 1:
            return i

참고할 만한 코드

def solution(n):
    return next(i for i in range(2, n) if n%i == 1)

iter와 next

  • iter
    • 객체의 __iter__ 메서드 호출
    • 반복을 끝낼 값을 지정하면 특정 값이 나올 때 반복을 끝냄
    • iter(호출 가능한 객체, 반복을 끝낼 값)
      • 반복 가능한 객체 대신 호출 가능한 객체(callable)를 넣어줌
      • 반복을 끝낼 값은 sentinel이라고 부름(감시병이라는 뜻→반복을 감시하다가 특정 값이 나오면 반복을 끝냄)
'''
random.randint(0, 5)와 같이 0부터 5까지 무작위로
숫자를 생성할 때 2가 나오면 반복을 끝내게 할 수 있음
이때 호출 가능한 객체를 넣어야 하므로 매개변수가 없는
함수 또는 람다 표현식으로 만들어 줘야 함
'''
>> import random
>> it = iter(rambda : random.randint(0, 5), 2)
>> next(it)
0
>> next(it)
3
>> next(it)
1
>> next(it)
Traceback (most recent call last):
	File "<pyshell#37>", line 1, in <module> 
    	next(it)
    StopIteration

next(it)로 숫자를 계속 만들다가 2가 나오면 StopIteration이 발생

>> import random
>> for i in iter(rambda : random.randint(0, 5), 2):
		print(i, end=" ")
# 출력: 3 1 4 0 5 3 3 5 0 4 1
# 숫자가 무작위로 생성되므로 next(it)를 호출하는 횟수도 매번 달라짐
# 아래 코드와 동작이 같음
import random
while True:
	i = random.randint(0, 5)
    if i == 2:
    	break
    print(i, end=" ")
  • next
    • 객체의 __next__ 메서드 호출
    • next(반복 가능한 객체, 기본값)
      • 기본값을 지정하면 반복이 끝나더라도 StopIteration이 발생하지 않고 기본값을 출력
    • 반복할 수 있을 때는 해당 값을 출력하고, 반복이 끝났을 때는 기본값을 출력
>> it = iter(range(3))
>> next(it, 10)
0
>> next(it, 10)
1
>> next(it, 10)
2
>> next(it, 10)
10
>> next(it, 10)
10
'''
0, 1, 2까지 나온 뒤에도 next(it, 10)을 호출하면 예외가 발생하지 않고 계속 10이 나옴
'''

16. x만큼 간격이 있는 n개의 숫자

  • 작성 코드
def solution(x, n):
    return [x*i for i in range(1, n+1)]

참고할 만한 다른 코드

def number_generator(x, n):
	return [i * x + x for i in range(n)]
def number_generator(x, n):
    y = [x];
    for i in range(1,n):
        y= y + [x+x*(i)]
    return(y)
profile
2 B R 0 2 B

0개의 댓글