Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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기 사전 캠프 3-1 본문

WHAT I LEARN/TIL

[TIL] AI 웹 개발 7기 사전 캠프 3-1

노네임드개발자 2024. 6. 3. 18:06

일일 알고리즘 코드카타 풀어보기

Q. 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

def solution(n):
    answer = 0
    for i in str(n):
        answer += int(i)
    return answer

처음엔 split()를 쓰고 더하는 방식으로 하려했지만 기준이 없어서 포기하고, 각 자릿수를 리스트화 시키기 위해서 고민하던 차에 반복문을 사용하여 문자열로 바꾸기로 했다. 그 리스트를 하나씩 더하는 방법으로 풀어봤다. 쉬운 문제를 너무 어렵게 생각하다보니 시간이 많이 지체되었다. 생각을 단순하게 하자.

 

Q. 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

def solution(n):
    divisor = []
    for i in range(1,n+1):
        if n % i == 0:
            divisor.append(i)
        answer = sum(divisor)
    return answer

약수를 구한 다음에 약수의 합을 구하는 형식으로 풀어봤는데 런타임 에러가 발생했다. 왜일까?

런타임 에러는 대부분 0이 문제일 때 발생하는 것으로 보여 0으로 대입해보니 코드가 성립이 되지 않았다. 제한사항이 0이상 3000이하인 것으로 보아 이 코드는 맞지 않는 것 같다.

def solution(n):
    answer = 0
    for i in range(1,n+1):
        if n % i == 0:
            answer += i
    return answer

그래서 원래 풀던 방식으로 약수는 나눴을 때 0이 되는 수를 의미하니 해당하는 수를 더하면 된다.

 

Q. 자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.

def solution(n):
    for x in range(1,n+1):
        if n % x == 1:
            answer = x
    return answer

첫번 째 시도. 반복문을 이용하여 나머지가 1인 값으로 나오게 했지만 예비 코드 실행 단계에서 틀렸다. n=10일 때 결과값이 3이 아닌 9가 나왔다.

def solution(n):
    for x in range(1,n+1):
        if n % x == 1:
            answer = x
            break
    return answer

그래서 다음과 같이 break를 추가하여 가장 작은 수에서 멈추게 하니 결과가 잘 나왔다.

 

엑셀보다 쉽고 빠른 SQL 2주차

2-1 2주차 오늘 배울 것

이번 수업에서 배울 내용 맛보기

  • 두 컬럼의 합계 값을 뽑거나, 전체 데이터의 갯수를 구할 수 있을까?
  • 범주별로 계산을 할 수 있을까?
  • 데이터를 가나다 순으로 정렬한다면 보고서에 바로 사용할 수 있을텐데!

2-2 엑셀 대신 SQL로 한번에 계산하기 (SUM, AVERAGE, COUNT, MIN, MAX)

1) 숫자 연산 기호를 SQL 에서도 사용할 수 있나요?

가능(+,-*,/)

select food_preparation_time,

delivery_time,

food_preparation_time + delivery_time as total_time

from food_orders

 

select food_preparation_time,

delivery_time,

food_preparation_time * delivery_time as total_time

from food_orders

 

2) 기본 연산, 합계와 평균 구하기

함수 종류

합계 : SUM(컬럼)

평균 : AVG(컬럼)

select sum(food_preparation_time) total_food_preparation_time,

avg(delivery_time) avg_delivery_time

from food_orders

ex)

SELECT AVG(age) as average_of_age

FROM customers

 

3) 전체 데이터의 갯수 구하기

select count(1) count_of_orders,

count(distinct customer_id) count_of_customers

from food_orders

 

count(1): 테이블(food_orders)에 있는 '모든' 데이터 값을 세주는 명령어 count(*)도 가능

distinct customer_id : customer_id 컬럼에 몇 개의 값을 세주는 명령어

ex)

SELECT COUNT(1) as total_count

FROM payments

SELECT COUNT(DISTINCT pay_type) as count_of_paytype

FROM payments

 

4) 데이터의 범위, 최솟값과 최댓값 구하기

select min(price) min_price,

max(price) max_price

from food_orders

ex)

select MIN(quantity) as min_quantity,

MAX(quantity) as max_quantity

from food_orders

 

2-3 [실습] WHERE 절로 원하는 데이터를 뽑고, 계산해보기

1) [실습] 주문 금액이 30,000원 이상인 주문건의 갯수 구하기

(1) Query 를 적기 전에 흐름을 정리해보기 

1. 어떤 테이블에서 데이터를 뽑을 것인가 - 주문 테이블

2. 어떤 컬럼을 이용할 것인가 - 주문 금액

3. 어떤 조건을 지정해야 하는가 - 30000원 이상

4. 어떤 함수 (수식) 을 이용해야 하는가 - 갯수(count)

 

(2) 구문으로 만들기

1. 어떤 테이블에서 데이터를 뽑을 것인가 - from food_orders

2. 어떤 컬럼을 이용할 것인가 - price, order_id(개수를 구할 때 하나 명명해준다는 의미)

3. 어떤 조건을 지정해야 하는가 - where price >= 30000

4. 어떤 함수 (수식) 을 이용해야 하는가 count(order_id) 혹은 count(1)

두가지 모두 가능 

 

(3) 전체 구조로 합치기

SELECT count(1) as cnt_orders

FROM food_orders

WHERE price >= 30000

 

2) [실습] 한국 음식의 주문 당 평균 음식가격 구하기

(1) Query 를 적기 전에 흐름을 정리해보기

1. 어떤 테이블에서 데이터를 뽑을 것인가 - 주문 테이블

2. 어떤 컬럼을 이용할 것인가 - 음식 종류, 음식 가격

3. 어떤 조건을 지정해야 하는가 평균 가격

4. 어떤 함수 (수식) 을 이용해야 하는가 평균

 

(2) 구문으로 만들기

1. 어떤 테이블에서 데이터를 뽑을 것인가 food_orders

2. 어떤 컬럼을 이용할 것인가 price, cuisine_type

3. 어떤 조건을 지정해야 하는가 cuisine_type='Korean'

4. 어떤 함수 (수식) 을 이용해야 하는가 avg(price)

 

(3) 전체 구조로 합치기

SELECT AVG(price) as average_price

FROM food_orders

WHERE cuisine_type = 'Korean'

 

2-4 GROUP BY로 범주별 연산 한 번에 끝내기

1) 카테고리별로 숫자 연산을 간단하게 하기

  • 여러번의 Query 없이, 카테고리를 지정하여 수식 함수로 연산을 할 수 있다.
  • 이 때 사용되는 구문이 Group by

2) Group by 기본 구조

Group by 는 카테고리 컬럼 지정, 그리고 Group by 를 적어주는 것으로 적용 가능

select cuisine_type, sum(price) sum_of_price

from food_orders

group by cuisine_type

 

음식 타입 별로 음식 가격의 합을 나타낼 때 쓸 수 있다. 범주형 컬럼을 select에 적었을 때 group by에도 써줘야 한다.

 

3) [실습] Group by 를 이용하여 카테고리별 연산해보기

1.음식점별 주문 금액 최댓값 조회하기

SELECT restaurant_name, MAX(price) as max_price

FROM food_orders

group by restaurant_name

 

2.결제 타입별 가장 최근 결제일 조회하기

SELECT pay_type, MAX(date) as recent_date

FROM payments

group by pay_type

 

2-5 Query 결과를 정렬하여 업무에 바로 사용하기 (ORDER BY)

1) Query 결과는 항상 동일한 순서로 출력될까

-오름차순 : 숫자가 점점 커지는 순서로 정렬 order by sum(price)

-내림차순 : 숫자가 점점 작아지는 순서로 정렬 order by sum(price) DESC

 

2) 정렬문 Order by 의 기본구조

Order by 는 카테고리 컬럼 지정, 그리고 Order by 를 적어주는 것으로 적용 가능

select cuisine_type, sum(price) sum_of_price

from food_orders

group by cuisine_type

order by sum(price)

 

3) [실습] Order by 를 이용하여 데이터를 정렬해보기

1.음식점별 주문 금액 최댓값 조회하기 - 최댓값 기준으로 내림차순 정렬

- Query 를 적기 전에 흐름을 정리해보기

- 구문으로 만들기

- 전체 구조로 합치기

SELECT restaurant_name, MAX(price) max_price

FROM food_orders

group by restaurant_name

order by MAX(price) DESC

 

2.고객을 이름 순으로 오름차순으로 정렬하기

- Query 를 적기 전에 흐름을 정리해보기

- 구문으로 만들기

- 전체 구조로 합치기

SELECT *

FROM customers

order by name

 

order by절은 두가지 이상 컬럼을 이용해서 정렬할 수 있다. 이름뿐만 아니라 성별, 그 이상까지 적용가능

쉼표을 이용!

SELECT *

FROM customers

order by gender, name

 

작성 순서대로 정렬이 된다. 성별로 정렬한 후 이름 정렬.

 

2-6 SQL 구조 마스터 - WHERE, GROUP BY, ORDER BY 로 완성되는 SQL 구조

1) 완성된 SQL 문의 기본 구조

select
from
where
group by
order by

 

2) [퀴즈] 조회 할 데이터를 SQL 구조에 맞춰서 바꿔보기

(1) 구조 맞춰보기

1. order by sum(delivery_time) desc 

2. group by cuisine_type

3. where day_of_the_week=’Weekend’

4. from food_orders

5. select cuisine_type, sum(delivery_time) total_delivery_time

정답

5. select cuisine_type, sum(delivery_time) total_delivery_time

4. from food_orders

3. where day_of_the_week=’Weekend’

2. group by cuisine_type

1. order by sum(delivery_time) desc 

 

(2) 구조 맞춰보기

1. where age between 20 and 40

2. select age, count(name) count_of_name

3. order by age

4. group by age

5. from customers

정답

2. select age, count(name) count_of_name

5. from customers

1. where age between 20 and 40

4. group by age

3. order by age

 

HW. 2주차 숙제 해설

음식 종류별 가장 높은 주문 금액과 가장 낮은 주문금액을 조회하고, 가장 낮은 주문금액 순으로 (내림차순) 정렬하기

SELECT cuisine_type, max(price) max_price, MIN(price) min_price

FROM food_orders

group by cuisine_type

order by min(price) DESC

 

마지막에 낮은 주문금액 순으로 정렬하기에서 min(price)를 넣지 않고 그냥 price만 넣었더니 음식 종류마다 최대 최소만 있다보니 정렬이 되지 않았다. 문제를 좀 자세히 읽고 이해한 다음에 쿼리를 작성하자.