72일차

Suhyeon Lee·2025년 1월 13일

CodeKata

SQL

프로그래머스: 특정 물고기를 잡은 총 수 구하기

  • 작성한 쿼리
SELECT
  COUNT(*) AS fish_count
FROM
  fish_info fi
  JOIN fish_name_info fni
  USING(fish_type)
WHERE
  fni.fish_name IN('BASS', 'SNAPPER')
;
  • 다른 방법으로도 풀어보기
    1)
WITH get_fish_type AS (
  SELECT
    fish_type
  FROM
    fish_name_info
  WHERE
    fish_name IN ('BASS', 'SNAPPER')
)
SELECT
  COUNT(*) AS fish_count
FROM
  fish_info
WHERE
  fish_type IN (TABLE get_fish_type)
;

2)

WITH get_fish_type AS (
  SELECT
    fish_type
  FROM
    fish_name_info
  WHERE
    fish_name IN ('BASS', 'SNAPPER')
)
SELECT
  COUNT(*) AS fish_count
FROM
  fish_info
  jOIN get_fish_type
  USING(fish_type)
;

프로그래머스: 특정 형질을 가지는 대장균 찾기

  • 작성한 쿼리
SELECT
  COUNT(*) AS `count`
FROM
  ecoli_data 
WHERE
  genotype & 5
  AND NOT genotype & 2
;
WHERE 
  (GENOTYPE & 1 > 0
  OR GENOTYPE & 4 > 0)
  AND (GENOTYPE & 2 = 0) 

처럼 조건을 걸어주지 않아도 되는 이유
→ where 절에선 0이 아닌 비트는 전부 True
따라서 GENOTYPE & 5 연산이 0이 아니기만 하면 됨

참고할 만한 다른 풀이

  1. conv()
select count(*) as COUNT
from ecoli_data
where
CONV(genotype,10,2) = '1' or
CONV(genotype,10,2) like '%001' or
CONV(genotype,10,2) like '%100' or
CONV(genotype,10,2) like '%101'

왜 1,3번 형질을 구하는데 GENOTYPE의 비트연산자 4를 쓰나요?
1,3번 형질을 구하는거면 GENOTYPE & 1 or GENOTYPE & 3으로 해야하는거 아닌가요?
문제에서 형질의 번호는 2진수에서 1의 위치, 값은 별개로 2진수 자체값으로 비교를 하기 때문입니다.
genotype이 1111(2)일 경우
1,2,3,4를 포함한다는 의미입니다.
형질1은 0001(2) -> 1
형질2는 0010(2) -> 2
형질3은 0100(2) -> 4
형질4는 1000(2) -> 8
과 같이 해당되고, 따라서 형질1과 3을 비교할려면 값 1과 4를 비교해야 하는 것이죠.

  1. 나머지를 이용한 풀이
-- 1
SELECT COUNT(*) AS "COUNT"
FROM ECOLI_DATA
WHERE GENOTYPE % 8 IN (1,4,5);

--2
SELECT 
count(*) as COUNT
FROM ECOLI_DATA
WHERE TRUNCATE((GENOTYPE%4)/2, 0) = 0 and 
(GENOTYPE%2 = 1 or TRUNCATE((GENOTYPE%8)/4, 0) = 1)
;

Python

81. n개의 최소공배수

  • 작성한 코드
def solution(arr):
    from math import gcd
    answer = arr[0]
    for i in arr:
        answer = answer*i // gcd(answer, i)
    return answer

참고할 만한 다른 풀이

  1. 배열 안의 최대값의 배수를 통해 최소공배수를 구하는 방법
def solution(arr):
    answer = 0
    n = 1                           
    
    while True:
        answer = max(arr) * n       # 가장 큰 수의 배수 기준으로 최소공배수를 구함.
        result = True               # if result=True: 최소공배수    else: 최소공배수가 아님
        for num in arr:
            if answer % num != 0:   
                result = False      # answer가 나누어 떨어지지 않으면 result=False로 변경 후 break
                break
        if result:                  # result 판별 True이면 while True문을 빠져나옴
            break                   
        n += 1
        
    return answer
import math
def lcm(a, b):
    return a*b // math.gcd(a, b)

def solution(arr):
    n = arr[00
    for i in arr[1:]:
        n = lcm(n, i)
    return n
def solution(arr):
    temp = lcm(arr[0],arr[1])
    for i in range(2,len(arr)):
        temp = lcm(temp,arr[i])
    return temp

def lcm(a, b):
    for i in range(max(a, b), (a * b) + 1):
        if i % a == 0 and i % b == 0:
            return i

최종 프로젝트

  • DB에 올리는 과정에서 오류가 나서 주말의 노력이 물거품이 되었다😥

    • 그래도 다행히 주말에 해놓은 거 가지고 파이썬에서 바로 돌릴 수 있는 코드로 수정해서 팀원들한테 api로 match result 받아 분석 진행할 수 있는 코드 공유했음!
  • 매치 결과를 살펴볼 기간을 정했음

    • 시즌 5: 2024.11.06 12:00:00 - 2024.12.05 09:00:00 (30일)
    • 시즌 6: 2024.12.12 12:00:00 - 2025.01.10 09:00:00 (30일)
  • 주말에 생각한 방법은 시간이 너무 오래 걸려서 그냥 임의의 GameId 넣기로 했음

    • 코드 전면 재수정이다~
profile
2 B R 0 2 B

0개의 댓글