파이썬

[250305] 파이썬 종합 1주차 + 코드카타 44-50

jeonieee 2025. 3. 5. 21:10
  • colab 단축키
      1. 코드 실행: 코드 셀을 실행하려면 Shift + Enter 를 누릅니다.
      2. 새 코드 셀 추가: 코드 셀을 추가하려면 코드 셀 위에서 Ctrl + M + A (Windows 및 Linux) 또는 Command + M + A (Mac)를 누릅니다.
      3. 코드 셀 삭제: 코드 셀을 삭제하려면 코드 셀 위에서 Ctrl + M + D (Windows 및 Linux) 또는 Command + M + D (Mac)를 누릅니다.
      4. 코드 셀 분할: 코드 셀을 분할하려면 코드 셀 위에서 Ctrl + M + 하이픈(-) (Windows 및 Linux) 또는 Command + M + 하이픈(-) (Mac)을 누릅니다.
      5. 셀 유형 변경: 코드 셀을 마크다운 셀로 변경하려면 코드 셀 위에서 Ctrl + M + M (Windows 및 Linux) 또는 Command + M + M (Mac)를 누릅니다.
      6. 실행 취소 : ctrl + M + Z

 

  • 변수
# 변수 선언과 할당
age = 25
name = "Alice"

# 변수 사용
print(name)  # "Alice" 출력
print("나이:", age)  # "나이: 25" 출력

# 변수를 사용한 연산
double_age = age * 2
print("나이의 두 배:", double_age)  # "나이의 두 배: 50" 출력
---------------------------------------------
# 변수의 자료형 확인
print(type(age))   # <class 'int'> 출력
print(type(name))  # <class 'str'> 출력
  • 문자열
# 문자열 변수 선언
name = "Alice"
greeting = 'Hello, World!'

# 문자열 연산
full_greeting = greeting + " My name is " + name
print(full_greeting)  # "Hello, World! My name is Alice" 출력

# 문자열 메서드 활용
sentence = "python programming is fun"
print(sentence.upper())         # 대문자로 변환하여 출력
  • 숫자열
# 숫자열 변수 선언
num1 = 10
num2 = 3.14

# 숫자열 연산
sum_result = num1 + num2
diff_result = num1 - num2
product_result = num1 * num2
division_result = num1 / num2
integer_division_result = num1 // num2
remainder_result = num1 % num2

print("합:", sum_result)
print("차:", diff_result)
print("곱:", product_result)
print("나누기:", division_result)
print("정수 나누기:", integer_division_result)
print("나머지:", remainder_result)

# 숫자열 함수와 메서드 활용
num3 = -7.89
abs_result = abs(num3)   # 절댓값 계산
round_result = round(num3)  # 반올림 계산

print("절댓값:", abs_result)
print("반올림:", round_result)
    • 정수형과 실수형의 차이
# 정수형 변수 선언
num1 = 10
num2 = -5

# 정수형 변수끼리의 연산
sum_result = num1 + num2
print("합:", sum_result)  # 출력: 합: 5

# 정수형 연산 결과
print("합의 자료형:", type(sum_result))  # 출력: 합의 자료형: <class 'int'>
----------------------------------------------------------------------------
# 실수형 변수 선언
num3 = 3.14
num4 = -0.5

# 실수형 변수끼리의 연산
product_result = num3 * num4
print("곱:", product_result)  # 출력: 곱: -1.57

# 실수형 연산 결과
print("곱의 자료형:", type(product_result))  # 출력: 곱의 자료형: <class 'float'>
  • 불리언 : 참 or 거짓
# Boolean 변수 선언
is_raining = True
is_sunny = False



# 비교 연산자를 사용하여 Boolean 값 비교
x = 10
y = 5

greater_than = x > y
print(greater_than)  # True 출력
  • NaN : 결측치
# 0으로 나누는 연산
result = 1 / 0
print(result)  # 출력: Infinity

import math

# 유효하지 않은 수학적 연산
result = math.sqrt(-1)
print(result)  # 출력: nan

import pandas as pd

# NaN을 포함한 데이터프레임 생성
data = {'A': [1, 2, None],
        'B': [3, None, 5]}
df = pd.DataFrame(data)

print(df)
# 출력:
#      A    B
# 0  1.0  3.0
# 1  2.0  NaN
# 2  NaN  5.0
  • 입력문
name = input("이름을 입력하세요: ")
print("안녕하세요,", name, "님!")

num1 = int(input("첫 번째 숫자를 입력하세요: "))
num2 = int(input("두 번째 숫자를 입력하세요: "))
sum = num1 + num2
print("두 숫자의 합은", sum, "입니다.")
  • 변수1) 데이터를 담고자 할 때 사용
# 학생들의 성적 데이터를 변수에 할당
grade1 = 85
grade2 = 92
grade3 = 78
grade4 = 90
grade5 = 88

# 각 변수에 담긴 데이터 출력
print("첫 번째 학생의 성적:", grade1)
print("두 번째 학생의 성적:", grade2)
print("세 번째 학생의 성적:", grade3)
print("네 번째 학생의 성적:", grade4)
print("다섯 번째 학생의 성적:", grade5)
  • 변수2) 계산된 값을 담고자 할 때 사용
# 데이터를 변수에 할당
data1 = 85
data2 = 92
data3 = 78
data4 = 90
data5 = 88

# 데이터의 평균 계산
total = data1 + data2 + data3 + data4 + data5  # 모든 데이터의 합을 계산
count = 5  # 데이터의 개수를 직접 지정
average = total / count  # 데이터의 평균을 계산

# 결과 출력
print("데이터 평균:", average)
  • 변수3) 머신러닝 모델구조 자체를 담을 때 사용
from sklearn.linear_model import LinearRegression

# 선형 회귀 모델 객체 생성
model = LinearRegression()

 


코드카타 44. 가격대 별 상품 개수 구하기

PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.

  • 내 풀이
SELECT case when price<10000 then 0
            when price<20000 then 10000
            when price<30000 then 20000
            when price<40000 then 30000 end as price_group,
      count(*) as products
from product
group by 1
order by 1
  • 정답
    • else floor(price/10000)*10000 은 그 외 값은 가격을 10000으로 나눠서 반올림한 후 다시 10000을 곱한다는 뜻
SELECT CASE WHEN PRICE < 10000 THEN 0
            WHEN PRICE < 20000 THEN 10000
            WHEN PRICE < 30000 THEN 20000
            WHEN PRICE < 40000 THEN 30000
            ELSE FLOOR(PRICE / 10000) * 10000 END AS PRICE_GROUP,
       COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP

 

45. 3월에 태어난 여성 회원 목록 출력하기

  • MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.
    • 정답
      • 틀린이유 : month(컬럼) = 원하는 달 사용 알아두기 
SELECT member_id,
       member_name,
       gender,
       date_format(date_of_birth,'%Y-%m-%d') as date_of_birth
from member_profile
where (month(date_of_birth) = 03) and (gender = 'w') and (tlno is not null)
order by 1

 

46.  대여 기록이 존재하는 자동차 리스트 구하기

  • CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 자동차 종류가 '세단'인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력하는 SQL문을 작성해주세요. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬해주세요.
SELECT distinct c.car_id
from car_rental_company_car as c join car_rental_company_rental_history as h on c.car_id=h.car_id
where (car_type='세단') and (month(start_date) = 10)
order by car_id desc

 

47. 모든 레코드 조회하기

  • 동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요.
SELECT *
from animal_ins
order by animal_id

 

48. 즐겨찾기가 가장 많은 식당 출력하기

REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

  • 내 풀이
    • where 절에 함수 사용 안됨
    • 서브쿼리 사용해야함
SELECT food_type,
       rest_id, 
       rest_name,
       favorites
from rest_info
where max(favorites)
group by 1
order by food_type desc
  • 정답
    • 서브쿼리 안에서 max와 푸드타입 고정 후 바깥 쿼리에 고대로 사용할거기 때문에 where(food_type, favorites) in
SELECT food_type,
       rest_id, 
       rest_name,
       favorites
from rest_info
where (food_type, favorites) in
(
select food_type, max(favorites)
    from rest_info
    group by food_type
)
order by food_type desc
select r.food_type,
r.rest_id,
r.rest_name,
r.favorites
from
(
select food_type,
max(favorites) as favorites
from rest_info
group by food_type
)a left join rest_info as r on a.food_type=r.food_type and a.favoritess=r.favorites
order by r.food_type desc

 

49. 식품분류별 가장 비싼 식품의 정보 조회하기

  • FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.
  • 내 풀이
    • 식품분류 해당건 찾는거 어케함
SELECT category, 
       price, 
       product_name
from food_product
where price in 
(
select max(price)
    from food_product
    group by category
)
order by price desc
  • 정답
SELECT category, 
       price as max_price, 
       product_name
from food_product
where category in ('과자', '국', '김치', '식용유') and price = 
(
select max(price)
    from food_product as FP
        WHERE FP.CATEGORY = FOOD_PRODUCT.CATEGORY
)
order by 2 desc

 

50. 5월 식품들의 총매출 조회하기

  • FOOD_PRODUCT와 FOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.
  • 내 풀이
    • 총매출이므로 합까지 해야함
    • date_format 쓰세요 !
    • 그룹별로 묶어주기
SELECT p.product_id,
       p.product_name, 
       (p.price*o.amount) as total_sales
from food_product as p join food_order as o on p.product_id=o.product_id
where in_date like '2022-05-%'
order by 3 desc, 1
  • 정답
select p.product_id,
       p.product_name,
       sum(p.price * o.amount) as total_sales
from food_product as p join food_order as o on p.product_id=o.product_id
where date_format(o.produce_date,'%Y-%m')='2022-05' 
group by p.product_id, p.product_name
order by sum(p.price * o.amount) desc, p.product_id asc