TIL

2024-04-11

여연찌 2024. 4. 11. 16:48
  • Today

1. ADsP 강의 (정형 데이터 마이닝)

2. 파이썬 코드카타

3. SQL 코드카타

 

 


  • Today I Learned

SQL

 

입양 시각 구하기

https://lyj-01.tistory.com/90

 

입양 시각 구하기(2) #WITH RECURSIVE , SET함수

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대

lyj-01.tistory.com

 

단순히 시간별 카운트를 해주면 되는줄 알고 이렇게 작성했는데..

SELECT HOUR(datetime) HOUR, COUNT(*) COUNT
FROM ANIMAL_OUTS
GROUP BY 1
ORDER BY 1

문제에서 원하는 0시부터~23시까지가 포함되어 있지 않고 해당 테이블 내의 입양시각만 카운트 되어 오답!

그럼 해당 테이블에 없는 입양시각은 어떻게 만들어야 하나 고민 하다

CASE WHEN 을 사용해서 하나씩 다 입력을 해야하나 했는데.. 너무 비효율적인 것임..

 

구글링을 하니 재귀쿼리 라는 것과 파이썬 처럼 변수를 주는 방식이 있는 것을 발견했다!!

WITH RECURSIVE TIME AS(
SELECT 0 AS h
    UNION ALL
    SELECT h+1 FROM TIME WHERE h < 23)

SELECT h, COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM TIME LEFT OUTER JOIN ANIMAL_OUTS
ON TIME.h=HOUR(ANIMAL_OUTS.DATETIME)
GROUP BY h
ORDER BY h

WITH RECURSIVE 

recursive with 구문이라고도 불린다

초기값 부터 반복을 멈추는 조건까지의 값을 입력하여 가상의 테이블을 생성해준다

 

SET @hour =-1;
SELECT (@hour := @hour+1) AS HOUR,
        (SELECT COUNT(*) 
         FROM ANIMAL_OUTS 
         WHERE HOUR(DATETIME) = @hour) AS COUNT 
FROM ANIMAL_OUTS
WHERE @hour < 23
ORDER BY HOUR;

SET 함수 

: 변수명 앞에 @ 를 넣어준다

: 변수에 값을 대입하여 테이블을 만들어준다.


파이썬

내적

https://lyj-01.tistory.com/89

 

내적 # zip()

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요. 이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의

lyj-01.tistory.com

인덱스의 값끼리 곱해주는 방안은 떠올리지 못해서

일단 입출력 예시를 보고 수기로라도 풀어보려고 시도해봄

def solution(a, b):
    answer = 0
    if len(a)==3:
        answer += a[0]*b[0]
        answer += a[1]*b[1]
        answer += a[2]*b[2]
        answer += a[3]*b[3]
    elif:
        answer += a[0]*b[0]
        answer += a[1]*b[1]
        answer += a[2]*b[2]
    return answer

 

SyntaxError: invalid syntax

 

네에 그럴줄 알았고요!

while 을 써볼까 하고 지난번에 했던 콜라츠 추측 포스팅을 보고 따라해보았다

def solution(a, b):
    answer = 0
    while len(a)!=len(b):
        if len(a)==len(b):
            answer += a*b
        result = sum(answer)
    return result

UnboundLocalError: local variable 'result' referenced before assignmen

 

음 에러 원인은 result 가 없는 변수였기 때문이라고 함!

    answer = 0
    result = 0
    while len(a)!=len(b):
        if len(a)==len(b):
            answer += a*b
        result = sum(answer)
    return result

result = 0 을 선언해주었는데 결괏값이 0 이었움..

 

리스트*리스트는 안되는 것 같다!

return int(a)*int(b)

int 형이 아니어서 곱해줄 수 없다길래 저렇게 했더니

int() 인수는 list 가 아닌 문자열 등이어야 한다고 에러가 떴다

 

열심히 구글링을 통해 리스트*리스트를 할 수 있는 함수가 있는 것을 발견!

 

zip() 메서드

: 순회 가능한 객체를 인자로 받고, 차례로 접근하여 반복자를 반환

: 두 그룹의 데이터를 서로 엮어주는 내장 함수

# for x*y in zip(list1,list2)

f solution(a, b):
    answer = [x*y for x,y in zip(a,b)]
    result = sum(answer)
    return result

a와 b 리스트를 묶어 x와 y 로 뽑아낸 후 x*y 를해준다

만든 리스트를 더해준다..!

 

내가 처음에 생각했던 리스트의 길이만큼 곱해주고 싶었다면

def solution(a, b):
    answer = 0
    for i in range(len(a)):
        answer += a[i]*b[i]
    return answer

이런 방식도 가능하다

사실 이렇게 풀고 싶었는데 인덱스를 뽑아주고 싶다면 i 값을 주어도 됐을 것을~~

다음에는 이런 알고리즘으로 풀어볼 수 있도록 공부해야겠당

 

 

 

 


  • Next

1. ADsP 강의

2. SQL 코드카타 복습

3. 알고리즘 코드카타 복습

'TIL' 카테고리의 다른 글

2024-04-15  (0) 2024.04.15
2024-04-12  (0) 2024.04.12
2024-04-09  (0) 2024.04.09
2024-04-08  (0) 2024.04.08
2024-04-05  (0) 2024.04.05