69일차

Suhyeon Lee·2025년 1월 8일

CodeKata

SQL

프로그래머스: 월별 잡은 물고기 수 구하기

  • 작성한 쿼리
SELECT
  COUNT(*) AS fish_count
  , MONTH(time) AS `month`
FROM
  fish_info
GROUP BY
  MONTH(time)
ORDER BY
  MONTH(time)
;

프로그래머스: 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기

  • 작성한 쿼리
SELECT
  COUNT(*) AS fish_count
  , MAX(length) AS max_length
  , fish_type
FROM
  fish_info
GROUP BY
  fish_type
HAVING
  AVG(COALESCE(length, 10)) >= 33
ORDER BY
  fish_type
;

참고할 만한 다른 풀이

  1. CTE
WITH FISH_CTE AS (
    SELECT FISH_TYPE, IF(LENGTH IS NULL, 10, LENGTH) LENGTH
    FROM FISH_INFO
)
SELECT COUNT(*) FISH_COUNT, MAX(LENGTH) MAX_LENGTH, FISH_TYPE
FROM FISH_CTE
GROUP BY FISH_TYPE
HAVING AVG(LENGTH) >= 33
ORDER BY FISH_TYPE
  1. IFNULL
SELECT COUNT(*) FISH_COUNT, MAX(LENGTH) MAX_LENGTH, FISH_TYPE
FROM FISH_INFO
GROUP BY FISH_TYPE
HAVING AVG(IFNULL(LENGTH, 10)) >= 33
ORDER BY FISH_TYPE
  1. CASE WHEN
SELECT COUNT(ID) AS FISH_COUNT,MAX(LENGTH) AS MAX_LENGTH, FISH_TYPE
FROM FISH_INFO
GROUP BY FISH_TYPE
HAVING AVG(CASE WHEN LENGTH <= 10 THEN 10 
                WHEN LENGTH IS NULL THEN 10 
                ELSE LENGTH 
           END ) >= 33
ORDER BY FISH_TYPE ASC

Python

78. 피보나치 수

def solution(n):
    a, b = 0, 1 # A
    for i in range(2, n+1): # B 
        answer = a + b # C
        a, b = b, answer # D
    return answer % 1234567

A: F(0) = a, F(1) = b
B: n은 2 이상이므로 2부터 n까지 for문 범위
C: F(n) = F(n-1) (n-2)
D: b=a+1, answer=b+1 → a는 다음 루프에서 b가 되고 b는 다음 루프에서 answer가 됨

참고할 만한 다른 풀이

  1. List 활용
def solution(n):
    answer = [0,1]                              # F(0) = a, F(1) = b

    for i in range(2,n+1):                      # n은 2 이상이므로 2부터 n까지
        answer.append(answer[i-1]+answer[i-2])  # F(n) = F(n-1) + F(n-2)

    return answer[-1] % 1234567                 # 1234567로 나눈 나머지 반환

→ 변수 선언이 아닌 list에 append를 진행하면서 담긴 수를 활용하여 연산하고 마지막에 담긴 수를 나머지 연산하여 리턴하는 코드

  • 작은 수가 입력되었을 때 큰 차이가 없지만 큰 수가 입력될 때 실행시간이 비교적 커짐
  1. 재귀 활용
def solution(n):
    if n < 2:
        return n
    else:
        return (solution(n - 1)+solution(n - 2)) % 1234567

→ 재귀호출을 활용해서 구현한 코드

  • 코드가 훨씬 더 간결해졌지만 시간 초과가 발생
    • recursive하게 구현하여 많은 실행 시간이 걸리는 경우가 생긴다면 짧은 코드가 시스템을 죽게 만들 수도 있기 때문에 문제를 이해하고 적절한 상황이 아니라면 쓰지 않는 것이 중요
  1. For loop을 활용한 코드를 좀 더 리팩터링
def solution(n):
    a, b = 0, 1          # F(0) = a, F(1) = b
    for i in range(n):
        a, b = b, a + b  # F(n) = F(n-1) + F(n-2)
    return a % 1234567   # 1234567로 나눈 나머지 반환
def solution(n):
    temp1 = 0
    temp2 = 1
    sum = 1
    for i in range(3, n + 1):
        temp1 = temp2
        temp2 = sum   
        sum = temp1 + temp2
        
    return sum % 1234567
    
 # 추가: SUM 없이
 def solution(n):
    temp1 = 0
    temp2 = 1
    for _ in range(2, n + 1):
        temp1, temp2 = temp2, temp1 + temp2
        
    return temp2 % 1234567
  1. Dynamic Programming, 다이나믹 프로그래밍
def solution(n):
    dp = [0]*100001
    dp[1] = 1
    
    for i in range(2, n+1):
        dp[i] = dp[i-1] + dp[i-2]
    
    return dp[n] % 1234567

→ 한 번 계산한 결과에 대해 저장해두어 이후 다시 계산하지 않는다

  • 0 ~ n 피보나치 수를 저장할 리스트 선언 후 0과 1에 대하여 초기값 설정
  • 2 ~ n까지 f(n) = f(n-1) + f(n-2)를 수행
  • dp[n]을 반환하되 1234567로 나눈 나머지로 반환 주의

SDL

: Self-Directed Learning
파이썬(Python) 피보나치 구현 7선

강의

자연어 처리 - 1회차
프로덕트 데이터사이언스 - 1회차

최종 프로젝트

이터널 리턴 분석
dak.gg 이터널 리턴

회고

  • 뭔가… 뭔가 프로젝트가 진행되고 있음…
  • API 관련 특강 2개 다시 들어야겠음
    • 특히 데이터 쌓는 부분!
profile
2 B R 0 2 B

0개의 댓글