HW1(SQL, Python)

mini_bang·2025년 1월 17일

SQL

-- 문제 1 : customer 테이블에서 10일 이상의 영화를 대여한 고객들의 first_name, last_name을 조회하시오.
SELECT c.first_name, c.last_name, DATEDIFF(r.return_date, r.rental_date) as rental_period, r.return_date, r.rental_date
FROM sakila.customer c
JOIN sakila.rental r ON c.customer_id = r.customer_id
WHERE DATEDIFF(r.return_date, r.rental_date) >= 10;

-- 문제 2 : (특정 조건에 맞는 고객 조회) customer 테이블에서 이름에 ‘a’가 포함된 고객들의 first_name, last_name의 고객을 조회하시오.
SELECT first_name, last_name
FROM sakila.customer
WHERE first_name LIKE '%a%';

-- 문제 3 : film 테이블에서 'Action' 장르의 영화 중, 2006년에 개봉한 영화의 title과 release_year를 조회하시오.
SELECT f.title, f.release_year
FROM sakila.film f
INNER JOIN sakila.film_category fc ON f.film_id = fc.film_id
WHERE fc.category_id = 1
GROUP BY title, release_year
HAVING f.release_year = '2006';

-- 문제 4 : film 테이블에서 'Comedy' 장르의 영화 중, rating이 'PG'인 영화의 title, release_year, rating을 조회하시오
SELECT f.title, f.release_year, f.rating
FROM sakila.film f
INNER JOIN sakila.film_category fc ON f.film_id = fc.film_id
WHERE fc.category_id = 5 AND f.rating = 'PG';


-- 테이블 내용 확인용
SELECT * FROM sakila.rental;
SELECT * FROM sakila.inventory;
SELECT * FROM sakila.customer;
SELECT * FROM sakila.film_category;
SELECT * FROM sakila.category;	-- Action: 1, Comedy: 5
SELECT * FROM sakila.film;

Python

"""
문제 5 : 문자열 속 단어 수 세기

목표: 사용자가 입력한 문자열에서 단어의 개수를 세는 프로그램을 작성합니다.

게임 규칙:
1. 사용자는 한 줄의 문자열을 입력합니다.
2. 프로그램은 그 문자열에서 공백을 기준으로 단어를 분리하고, 단어의 개수를 출력
합니다.
3. 공백만 있는 문자열이나, 앞뒤 공백이 있을 경우에도 올바르게 처리해야 합니다.
"""

a = str(input())
b = a.split()
print("단어의 개수는 : %d" %(len(b)))
print(b)

"""
문제 6 : 숫자 추측 게임

목표: 컴퓨터가 1부터 주어진 범위 내에서 무작위로 숫자를 선택하고, 사용자는 그 숫자
를 추측해야 합니다. 사용자가 추측할 때마다 컴퓨터는 힌트를 제공합니다. 힌트는 "더
작은 숫자입니다." 또는 "더 큰 숫자입니다."로 제공되며, 정답을 맞출 때까지 계속 반복
됩니다.

게임 규칙:
1. 컴퓨터가 범위 내에서 무작위로 숫자를 선택합니다.
2. 사용자는 숫자를 입력하여 추측합니다.
3. 매번 추측 후, 컴퓨터는 힌트를 제공합니다:

  o "더 작은 숫자입니다." 또는 "더 큰 숫자입니다."
  
  o 정답을 맞추면 게임이 종료됩니다.
4. 사용자가 정답을 맞출 때까지 계속 추측하며 점수를 받습니다.
5. 점수는 100점으로 시작하고, 틀릴 때마다 10점씩 차감됩니다

입력:

• 게임이 시작되면, 사용자는 추측할 숫자를 입력합니다.

출력:

• 각 추측마다 "더 작은 숫자입니다." 또는 "더 큰 숫자입니다."와 같은 힌트를 출력합니다.

• 정답을 맞추면 "정답입니다!"와 함께 최종 점수를 출력합니다.

• 점수가 0이 되면 게임이 종료됩니다.

제약 사항:

• 범위는 1부터 100까지 주어집니다.
"""

import random

def func():
  true_value = random.randint(1, 100)
  score = 100

  while score != 0:
    input_value = int(input())
    if input_value == true_value:
      print("정답입니다. 입력한 숫자 : %d" %input_value)
      break
    elif input_value < true_value:
      print("더 큰 숫자입니다. (-10)")
      score -= 10
    else:
      print("더 작은 숫자입니다. (-10)")
      score -= 10
  print("점수: %d점" %score)

func()

"""
문제 7. 십진수 a와 b가 주어집니다.
주어진 십진수 a와 b를 이진수로 변환하고, 그 후 다음 연산을 수행하세요:

  a와 b를 더한 결과를 이진수로 출력하세요.

  a에서 b를 뺀 결과를 이진수로 출력하세요.

  a와 b의 AND 연산 결과를 이진수로 출력하세요.

  a와 b의 OR 연산 결과를 이진수로 출력하세요.

  a와 b의 XOR 연산 결과를 이진수로 출력하세요.
"""

# 이진수 변환 함수
def to_binary(num):
    binary = []
    while num:
        remain = num % 2
        binary = [remain] + binary
        num //= 2
    if not binary:
        binary = [0]
    return binary

# 두 이진수의 길이를 동일하게 맞춰주는 함수
def binary_length(a, b):
    max_len = len(a) if len(a) > len(b) else len(b)
    a_length = [0] * (max_len - len(a)) + a
    b_length = [0] * (max_len - len(b)) + b
    return a_length, b_length

# 더하기 연산
def add(x, y):
    sum_result = x + y
    return sum_result % 2

# 빼기 연산
def subtract(x, y):
    if x > y:
        return 1
    else:
        return 0

# AND 연산
def and_op(x, y):
    if x and y:
        return 1
    else:
        return 0

# OR 연산
def or_op(x, y):
    if x or y:
        return 1
    else:
        return 0

# XOR 연산
def xor_op(x, y):
    if x != y:
        return 1
    else:
        return 0

# 각각의 연산 함수를 호출하고 연산하여 리스트에 추가
# (op: add, subtract, and_op, or_op, xor_op)
def binary_op(a, b, op):
    a, b = binary_length(a, b)
    result = []
    for i in range(len(a)):
        result.append(op(a[i], b[i]))
    return result

a = 10
b = 20

# 이진수 변환
a_bin = to_binary(a)
b_bin = to_binary(b)

# a + b
result_add = binary_op(a_bin, b_bin, add)
print(f"{a} + {b}: {result_add}")

# a - b
result_subtract = binary_op(a_bin, b_bin, subtract)
print(f"{a} - {b}: {result_subtract}")

# a AND b
result_and = binary_op(a_bin, b_bin, and_op)
print(f"{a} AND {b}: {result_and}")

# a OR b
result_or = binary_op(a_bin, b_bin, or_op)
print(f"{a} OR {b}: {result_or}")

# a XOR b
result_xor = binary_op(a_bin, b_bin, xor_op)
print(f"{a} XOR {b}: {result_xor}")

"""
문제 8. 2진수를 5진수와 10진수로 바꾸는 함수를 작성하시오.

10진수가 주어지면 2진수와 5진수로 바꿀수 있는 한꺼번에 작동할 수 있는 함수를 작성하시오.

2진수를 10진수와 5진수로 변환하는 함수
"""

def func(ten):
  # 10진수를 2진수로 변환
  def ten_to_two(ten):
      result = []
      while ten > 0:
          remain = ten % 2
          result.append(str(remain))
          ten = ten // 2
      if not result:
            result.append('0')
      return result

  # 10진수를 5진수로 변환
  def ten_to_five(ten):
      result = []
      while ten > 0:
          remain = ten % 5
          result.append(str(remain))
          ten = ten // 5
      if not result:
          result.append('0')
      return result

  # 10진수를 2진수와 5진수로 변환
  two = ten_to_two(ten)
  five = ten_to_five(ten)
  print(f"10진수 {ten} -> 2진수: {two}, 5진수: {five}")

func(10)

0개의 댓글