본문 바로가기

매일 TIL

[내일배움캠프 7-1일] 피보나치 수, SQL 3주차

피보나치 수

https://school.programmers.co.kr/learn/courses/30/lessons/12945

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

# 재귀
# 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공부 두배