피보나치 수
https://school.programmers.co.kr/learn/courses/30/lessons/12945
# 재귀
# O(2^n)
def solution_f(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return (solution(n-1) + solution(n-2)) % 1234567
우선 재귀로 풀어봤다. 역시 시간초과.
피보나치를 재귀로 구현하게 되면 O(2^n)의 시간복잡도를 가지게 됨.
fibo(n)이라는 함수가 있다고 할 때 fibo(5)를 구하려면 fibo(4)와 fibo(3)이 호출되고,
또 fibo(4)와 fibo(3)은 각각 fibo(3), fibo(2)와 fibo(2), fibo(1)을 호출시킨다.
상당히 비효율적인 방법.
# 리스트
# O(n)
def solution(n):
fibo_lst = [0, 1]
for i in range(2, n + 1):
fibo_lst.append((fibo_lst[i-1] + fibo_lst[i-2]) % 1234567)
return fibo_lst[-1]
리스트를 활용했다.
fibo_lst를 먼저 만들어 0번째, 1번째 값을 미리 넣어둠.
이후 2부터 n+1까지 반복하여 내 이전 인덱스의 값 + 내 전전 인덱스의 값을 하여 fibo_lst에 append함.
리스트의 가장 마지막 인자를 반환하면 완료.
n 크기만큼 연산을 하기 때문에 시간복잡도는 O(n).
replace
특정 문자를 다른 문자로 바꾸는 함수
replace(바꿀 컬럼, 현재 값, 바꿀 값)
ex) 식당명의 Blue Ribbon을 Pink Ribbon으로 바꾼다면
select restaurant_name "원래 상점명",
replace(restaurant_name, 'Blue', 'Pink') "바뀐 상점명"
from food_orders
where restaurant_name like '%Blue Ribbon%'
substr(ing)
원하는 문자만 남기는 함수
substr(조회 할 컬럼, 시작 위치, 글자 수)
ex) 주소에서 '시도'만 나오도록 수정한다면
select addr "원래 주소",
substr(addr, 1, 2) "시도"
from food_orders
where addr like '%서울특별시%'
concat
여러 컬럼의 문자를 합치는 함수
concat(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....)
ex) 서울시에 있는 음식점 이름을 '[서울] 음식점명'으로 합치고 싶다면
select restaurant_name "원래 이름",
addr "원래 주소",
concat('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름"
from food_orders
where addr like '%서울%'
case
조건을 여러가지 지정하는 함수
case when 조건1 then 값(수식)1
when 조건2 then 값(수식)2
else 값(수식)3
end
ex) 음식 타입을 ‘Korean’ 일 때는 ‘한식’, ‘Japanese’ 혹은 ‘Chienese’ 일 때는 ‘아시아’, 그 외에는 ‘기타’ 라고 지정한다면
select restaurant_name,
cuisine_type AS "원래 음식 타입",
case when (cuisine_type='Korean') then '한식'
else '기타'
end as " 음식 타입"
from food_orders
SQL 3주차 숙제
문제 : 다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요.
- 주중 : 25분 이상
- 주말 : 30분 이상
select order_id, restaurant_name, day_of_the_week, delivery_time,
case when day_of_the_week = 'Weekday' then if(delivery_time>=25,'Late','On-time')
when day_of_the_week = 'Weekend' then if(delivery_time>=30,'Late','On-time')
end "지연여부"
from food_orders
처음에는 이렇게 창의력 넘치게 풀어버렸다.
무려 case문 안에 if를 섞어서 상당히 당돌한 문장이 되어버렸음.
실행시켰을 때 예제의 결과 테이블과 동일하게 나와서 맞은 줄 알았다. 하지만 뭔가 이상해서 gpt에 물어보니,
case문 안에서는 if문을 사용할 수 없다고 함.
select order_id, restaurant_name, day_of_the_week, delivery_time,
case when day_of_the_week = 'Weekday' and delivery_time>=25 then 'Late'
when day_of_the_week = 'Weekend' and delivery_time>=30 then 'Late'
else 'On-time' end "지연여부"
from food_orders
이게 맞는 코드.
and를 사용해서 조건 두개를 모두 만족한다면 Late를 해주고,
else 구문에서 On-time 처리를 해주면 되는 것.
오늘의 회고
어제 너무 늦게 자서 오늘 완전 정신없었다.
피곤한 상태로 공부하느라 집중력 바닥이었음. 컨디션 조절 잘 하자.
오늘 하려고 했던 CS 공부는 내일 두배로 하는걸로...
내일의 목표는 코드카타, SQL 4주차, CS공부 두배
'매일 TIL' 카테고리의 다른 글
[내일배움캠프 7-3일] SQL 5주차, 기술면접 피드백 (0) | 2024.08.07 |
---|---|
[내일배움캠프 7-2일] SQL 4주차 (0) | 2024.08.06 |
[내일배움캠프 6-5일] 최댓값과 최솟값, SQL 2주차 (0) | 2024.08.02 |
[내일배움캠프 6-4일] 신고 결과 받기, SQL 1주차 (0) | 2024.08.01 |
[내일배움캠프 6-2일] 코드카타, RVC 음성합성 AI(1) (0) | 2024.07.30 |