Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL] AI 웹 개발 7기 사전 캠프 4-5 본문

WHAT I LEARN/TIL

[TIL] AI 웹 개발 7기 사전 캠프 4-5

노네임드개발자 2024. 6. 14. 18:03

일일 알고리즘/SQL코드카타

알고리즘26. 어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

 

제한사항

- absolutes의 길이는 1 이상 1,000 이하입니다.

- absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.

- signs의 길이는 absolutes의 길이와 같습니다.

- signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

 

입출력 예

absolutes signs results
[4, 7, 12] [true, false, true] 9
[1, 2, 3] [false, false, true] 0

 

def solution(absolutes, signs):
    answer = 0
    for i, a in enumerate(absolutes):
        if signs[i] == 'true':
            answer += a
        elif signs[i] == 'false':
            answer -= a
    return answer

enumerate() 함수로 인덱스와 absolutes의 수를 반복하게 한 다음 signs의 인덱스가 각각 참/거짓일 때 조건을 걸어줬다.

결과는 0으로 밖에 나오지 않아서 무엇이 문제인가 한참 고민했다.

def solution(absolutes, signs):
    answer = 0
    for i, a in enumerate(absolutes):
        if signs[i] == True:
            answer += a
        elif signs[i] == False:
            answer -= a
    return answer

질문하기를 찾아본 결과 문제가 이상한거 였다. 예시에 true, false등으로 표기되어 있어서 문자열인줄 알았지만, 애초에 문제에서는 불리언 배열이라고 언급을 했다. 찾아보니 파이썬의 불리언(boolean) 형태는 True, False 같이 대문자로 표기한다고 한다. 

 

SQL26. 입양 시각 구하기(1)

select hour(datetime) as hour,
       count(1) as count
from animal_outs
where hour between 9 and 19
group by hour
order by hour
#Unknown column 'hour' in 'where clause' hour 컬럼이 없다고 출력

아무리 생각해도 왜 오류가 나는지 이해가 안됐다. 

select hour(datetime) as hour,
       count(1) as count
from animal_outs
where hour(datetime) between 9 and 19 #함수 hour와 alias hour의 차이가 있을까봐 수정 시도
group by hour
order by hour

알고보니 where 절은 alias를 사용할 수 없었다. 사용할 수 없는 이유는 SQL의 엔진 프로세스는

FROM -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT 

순으로 진행되기 때문에 select보다 where가 먼자 사용되므로 alias를 쓸 수 없다.

https://full-dive.tistory.com/69

 

SQL) SELECT에서 쓴 alias는 왜 WHERE절에 못 쓸까?

그 이유는 바로 대부분의 SQL 데이터베이스에서 SELECT 절은 FROM 절 뒤와 WHERE 절 앞에서 처리된다. 즉, SELECT 절에 정의된 열 별칭은 WHERE 절이 처리될 때 아직 사용할 수 없음. SQL 엔진의 프로세스 FRO

full-dive.tistory.com

위의 블로그를 참고하여 더 자세한 사항을 알 수 있었다.

 

[SQL 과제] Lv1. 데이터 속 김서방 찾기

SELECT COUNT(1) as name_cnt  
FROM customers
WHERE name like '김%'

SELECT COUNT(1) as name_cnt  
FROM customers
WHERE SUBSTR(name, 1, 1) = '김' #문제에서 SUBSTR을 이용

코드를 제대로 입력했는지 확인하기 위해 비슷한 테이블인 customers 테이블로 문제를 풀어봤다.

 

정답

SELECT COUNT(DISTINCT(customer_id)) as name_cnt  
FROM customers
WHERE SUBSTR(name, 1, 1) = '김'

DISTINCT가 왜 들어가는지 이해가 되지 않아 매니져님께 질문을 하고 내린 결과

COUNT(1), COUNT(*): NULL 및 중복 값을 포함하는 행을 포함하여 SELECT 문에 의해 검색된 행을 카운트 COUNT(expression) : 컬럼이 NULL 이 아닌 값을 제외하고 카운트

COUNT(DISTINCT expression) : 컬럼이 NULL이 아닌 UNIQUE(고유)한 값만 카운트

 

[SQL 과제] Lv2. 날짜별 획득포인트 조회하기

SELECT date(created_at) as created_at,
       ROUND(AVG(point)) as averaged_points
FROM point_users
GROUP BY date(created_at)

문제 없이 잘 풀었다.

 

정답

SELECT DATE(p.created_at) AS created_at,
       ROUND(AVG(p.point)) AS average_points
FROM point_users p
GROUP BY DATE(p.created_at)

 

[SQL 과제] Lv3. 이용자의 포인트 조회하기

SELECT u.user_id,
       u.email,
       COALESCE(p.point, 0) point
FROM users u LEFT JOIN point_users p ON u.user_id = p.user_id 
ORDER BY p.point DESC

NULL을 0으로 치환하는 방법은 주어진 힌트에서 친절하게 COALESCE 함수를 이용하라고 하여 이용해 봤다.

https://www.w3schools.com/mysql/func_mysql_coalesce.asp

COALESCE 함수에 대한 자세한 설명은 위 링크를 참고 했다.