Python 연습문제와 해답

Kepler·2020년 1월 30일
1

Python

목록 보기
1/12
post-custom-banner

본 글은 개인적으로 Python 개념정리를 돕기 위하여, wecode의 Python 기초과정의 연습문제와 해답을 정리한 글입니다.

Assignment for elif and else

좌우와 상하가 모두 1 부터 8까지의 칸으로 이루어져 구성 되어 있는 체스보드가 있습니다.
주어진 input 값 2개를 통해서 해당 칸의 색깔이 검은색이면 "YES"를, 아니면 "NO" 를 출력하세요.

Input 값은 2개가 주어집니다. 첫번째 input은 X 축이며 두번째 input은 Y 축입니다.

예를 들어, input 값이 2와 6 이면 검은색 box 입니다.

image.png

my solution:

  • x와y를 구분하여 생각했고, 그 둘을 각각 충족 시키는 식을 찾아서 길어짐.
x = int(input())
y = int(input())

if x % 2 == 0 and y % 2 == 0:
    print("YES")
elif x % 2 == 1 and y % 2 == 1:
    print("YES")
else:
    print("NO")

model solution:

  • x,y를 묶어서 생각 짝수칸/홀수칸에서 x,y의 합이 어떠한 패턴을 보이는지 생각하여 식을 짬.
if (x + y) % 2 == 0:
  print('YES')
else:
  print('NO')

Assignment for Testing set of conditions

월(month)와 일(day), 이 2가지를 input 값으로 받았을때, 2019년의 해당 월과 일의 다음 날의 월과 일을 출력해주세요.

예를 들어, month 는 3이고 일은 31이면 2019년 3월 31일의 다음날은 4월 1일 임으로 다음과 같이 출력이 되면 됩니다 (월 과 일을 각각 다른 줄에 출력 해주세요).

my solution

  • if~elif까지 똑같은 실행문이 반복되어 redundant. 첫번째 if문에서 괄호를 적절히 사용하여 한번의 식으로 정리가능.
  • month가 12이상일때의 처리를 빼먹음.
month = int(input())
day = int(input())

if month == 2 and day == 28:
    month +=1
    day = 1
elif (month == 4 or 6 or 9 or 11) and day == 30:
    month += 1
    day = 1
elif (month == 1 or 3 or 5 or 7 or 8 or 10 or 12) and day == 31:
    month += 1
    day = 1
else:
    day += 1
    
print(month)
print(day)

model solution

  • my solution에서 3가지로 쓰인 부분을 하나의 if문에 괄호를 적절히 사용하여 묶음. month == 13 이 입력됬을경우의 값을 처리
month = int(input())
day = int(input())

if ((day == 30) and (month == 4 or month == 6 or month == 9 or month == 11)
    or (day == 28) and (month == 2)
    or (day == 31)):
  month += 1
  day = 1
else:
  day += 1
  
if month == 13:
  month = 1

print(month)
print(day)

Assignment for Nested If Statements

다음의 방정식을 해결하는 프로그램을 구현 하세요. x값을 구해야 합니다.

ax = b

결과 출력물은 다음과 같아야 합니다.

  1. Input 으로 주어진 a 와 b 값으로 위의 방정식을 충족하는 단 하나의 정수가 존재한다면 해당 정수를 출력하면 됩니다.
  2. 만일 a 와 b 값으로 위의 방정식을 충족하는 정수가 없다면 "No Solution"을 출력해주세요.
  3. a 와 b 값으로 위의 방정식을 충족하는 정수가 많다면 "Many Solutions"을 출력해주세요.

Hint:
a 나 b 는 0이 될 수 있습니다.

Examples:
만일 a = 1, b = -2 라면 결과값으로 -2가 출력이 되어야 합니다.
만일 a = 2, b = -1 라면 결과값으로 "No Solution"이 출력이 되어야 합니다.

my solution

  • a가 0이 아닐때의 경우의 수를 먼저 생각.
  • a!=0의 if문에서 b == 0 일떄와, b 나누기 a의 나머지값의 답을 따로 구함 ==> 둘다 no solution이 맞다는데.. b=0일때는 a가 아무 값이나 되도 0이니까 many solution 아닌가??
  • 두가지의 elif a==0일때의 경우는, 중첩loop가능하나, 여기까지 생각하지 못함.
a = int(input())
b = int(input())

if a != 0:
    if b % a == 0 :
        print(b // a)
    elif b % a != 0 :
        print("No Solution")
    elif b == 0:
        print("Many Solutions")
elif a == 0 and b > 0:
    print("No Solution")
elif a == 0 and b == 0:
    print("Many Solutions")

model solution

  • a를 기준으로 크게 a가 0일때와 그렇지 않을때를 비교.
  • a = 0일 때의 경우의 수를 먼저 작성 => 더욱 효율적인 식
  • a != 0 의 경우 중, 방정식을 충족할 경우를 작성.
  • 나머지는 No solution 으로 묶어줌.
a = int(input())
b = int(input())

if a == 0:
  if b == 0:
    print('Many Solutions')
  else:
    print('No Solution')
elif b % a == 0:
  print(b // a)
else:
  print('No Solution')

Assignment for Lists

Input으로 주어진 리스트의 첫번째와 마지막 element의 값을 더한 값을 리턴 해주세요.
만일 리스트가 비어있다면 0이 리턴되어야 합니다.
리스트의 총 길이가 1이라면 그 하나의 요소 값만 리턴해주면 됩니다.

예를 들어, 다음의 리스트가 주어졌다면:
inputs = [1, 2, 3, 4, 5]
다음과 같은 결과물이 출력 되어야 합니다.
6

만일 다음의 리스트가 주어졌다면:
inputs = [1]
다음과 같은 결과물이 출력 되어야 합니다.
1

my solution

  • len(my_list)가 0 or 1 인지를 매번 체크 (비효율적)
def add_first_and_last_elements(my_list): 
    if len(my_list) == 1:
        return my_list[0]
    elif len(my_list) == 0:
        return 0
    else:
        return my_list[0] + my_list[len(my_list) - 1]

model solution

  • length 라는 변수를 만듬.
  • length가 0 or 1인지를 매번 체크하지 않으며, if문이 false일때만 처리 (효율적)
def add_first_and_last_elements(my_list):
  length = len(my_list)
  
  if length > 1:
    return my_list[0] + my_list[length - 1]
  elif length == 1:
    return my_list[0]
  else:
    return 0

Assignment for Adding/Changing elements to List

  1. 주어진 2개의 리스트를 하나의 리스트로 합친 후 리스트의 첫 element와 마지막 element를 서로 바꿔준 후 리스트 전체를 출력해주세요.
  2. 빈 리스트가 들어온다면 빈리스트를 반환해야 합니다.

예를 들어, 다음과 같은 2개의 리스트가 주어졌다면
list1 = [1, 2, 3, 4, 5]
list2 = [6, 7]
출력되야 하는 결과물은 다음과 같습니다,
[7, 2, 3, 4, 5, 6, 1]

my solution

  • list의 합이 빈 list인지 아닌지를 if문으로 체크
  • a , b = b , a 형식으로 자리를 switch
def merge_and_swap(list1, list2):
    if list1 + list2 != []:
        list1 = list1 + list2
        list1[0] , list1[len(list1) - 1] = list1[len(list1) - 1] , list1[0]
        return list1
    else:
      return []

model solution

  • 두 리스트의 합의 길이가 1 이상일때를 if조건으로 설정 => else에 리스트가 0일때가 테스트됨
  • list1[0]list1[len(list1)-1 를 변수로 저장한 후, 각각의 값에 대입
  • length > 1 이 아닌경우는 length 가 0도 포함되기 때문에, 아래와 같은 코드로도 정리됨
def merge_and_swap(list1, list2):
  list1 = list1 + list2
  
  length = len(list1)
  
  if length > 1:
    first             = list1[0]
    last              = list1[length - 1]
    list1[0]          = last
    list1[length - 1] = first

    return list1
  else:
    return list1

Assignment for For loops

Input 으로 주어진 리스트에서 오직 한번만 나타나는 값 (unique value)을 가지고 있는 요소는 출력해주세요.

예를 들어, 다음과 같은 리스트가 주어졌다면:
[1, 2, 3, 4, 5, 1, 2, 3, 7, 9, 9, 7]
다음과 같이 출력되어야 합니다.
4
5

my solution

  • .count함수 사용
my_list = [s for s in input().split()]

for element in my_list:
    if my_list.count(element) == 1:
        print(f"{element}\n")

model solution

  • .count함수를 사용하지 않았을 때의 식
my_list       = [s for s in input().split()]
current_index = 0

for element in my_list:
  is_unique = True
  list_without_current_element = my_list[0:current_index] + my_list[current_index+1:]
  
  for element2 in list_without_current_element:
    if element == element2:
      is_unique = False
      break
    
  if is_unique:
    print(element)
    
  current_index += 1

Assignment for While loop

find_smallest_integer_divisor 라는 이름의 함수를 구현해 주세요.

  1. find_smallest_integer_divisor 함수는 하나의 parameter를 받습니다.
  2. Parameter 값은 integer만 주어집니다.
  3. find_smallest_integer_divisor 주어진 parameter 값을 정수로 나눌 수 있는 최소한의 수를 리턴하여야 합니다.

예제:
find_smallest_integer_divisor(15) == 3

my solution

  • while..else를 써서 return값을 지정.
def find_smallest_integer_divisor(numb): 
    divisor = 2
    while numb % divisor != 0:
      divisor += 1
    else:
      return divisor

model solution

  • while else사용하지 않음 -> 이유찾아보기
def find_smallest_integer_divisor(number):
  i = 2
     
  while number % i != 0:
    i += 1
  
  return i

Assignment for Class

Database 라는 이름의 class를 구현해 주세요.
Database 클래스는 다음의 속성(attribute)들을 가지고 있습니다.

  1. name : database의 이름
    size : 저장할 수 있는 데이터의 max 사이즈. Size를 넘어서는 데이터를 저장할 수 없다.

  2. Database 클래스는 다음의 메소드들을 가지고 있습니다.

  • insert
  • select
  • update
  • delete

Insert
insert 메소드는 self 외에 2개의 parameter를 받습니다.
field와 value 입니다.
Field 는 저장하고자 하는 데이터의 필드명 이고 value는 값입니다.
Field 와 value는 내부적으로 dictionary에 저장되어야 합니다.
insert 메소드는 다음 처럼 호출 할 수 있습니다.

객체 이름이 db 라는 가정하에
db.insert("name", "정우성")

insert 메소드는 특별한 리턴값은 없습니다.
만일 내부 dictionary의 총 사이즈가 database 클래스의 size 속성보다 크면 더이상 새로운 값들을 저장하지 말아야 합니다.

Select
select 메소드는 self 외에 1개의 parameter를 받습니다.
field 입니다.
Field 는 읽고자 하는 데이터의 필드명 입니다.
내부적으로 데이터를 저장하고 있는 dictionary에서 해당 field에 해당하는 키와 연결되어 있는 값을 리턴해주어야 합니다.

예를 들어, 이미 name이라는 필드명으로 "정우성" 이라는 값을 저장했다고 한다면:

객체 이름이 db 라는 가정하에
db.select("name")

"정우성"

이 되어야 합니다.
만일 해당 필드값으로 저정되어 있는 값이 없다면 None 을 리턴해주세요.

Update
Self 외에 2개의 parameter를 받습니다.
field와 value 입니다.
이름 그대로 이미 저장되어 있는 값을 수정하는 메소드 입니다.

객체 이름이 db 라는 가정하에
db.update("name", "아이유")

만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.
그리고 특별한 리턴 값은 없습니다.

Delete
delete 메소드는 self 외에 1개의 parameter를 받습니다.
field 입니다.
Field 는 지우고자 하는 데이터의 필드명 입니다.

객체 이름이 db 라는 가정하에
db.delete("name")

만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.
그리고 특별한 리턴 값은 없습니다.

my solution

  • 헤맨부분 => 배운점:
    • attribute부분에서 db를 만들어주는 부분이 이해가 가지 않았음. => argument를 받지 않아도 새로운 객체 생성이 가능하며, 여기서 생성된 객체는 이하 메소드에서도 사용이 가능함.
    • if field in self.db 를 모든 메소드에 추가하는 부분 => 딕셔너리의 키를 select, update, delete 할 때, 항상 먼저 해당 키가 존재하는지를 체크해야함,
class Database:
  def __init__(self, name, size):
    self.name = name
    self.size = size
    self.db = {}
  
  def insert(self, field, value):
    if len(self.db) < self.size:
     self.db[field] = value

  def select(self, field):
    if field in self.db:
        x = self.db[field]
        return x
    else:
      return None
    
  def update(self, field, value):
    if field in self.db:
      self.db[field] = value
    
  def delete(self, field):
    if field in self.db:
      del self.db[field]

Assignment for Exception Handling

divison 함수를 수정하여서 exception이 발생하는 경우 -1을 리턴하도록 해주세요.

my solution

  • elem변수를 설정할 필요가 굳이 없었다..
  • 모든 exception 을 정의하지 않아도 as e로 값을 받아도 OK.
def division(num1, num2):
  elem = 0
  
  try:
    elem = num1 / num2
  except ZeroDivisionError:
    elem = -1
  except Exception as e:
    elem = -1
  return elem

model solution

def division(num1, num2):
  try:
    return num1 / num2
  except Exception as e:
    return -1

Assignment for Complex Function Parameters

함수 2개를 구현해주세요. 함수의 이름은 다음과 같아야 합니다.

sum_of_numbers

what_is_my_full_name

  1. 함수 sum_of_numbers는 arugment로 주어지는 모든 수를 합한 값을 리턴해야 합니다.예를 들어, sum_of_numbers(1, 2, 3, 4, 5) 는 15를 리턴해야 하고 sum_of_numbers(1,2)는 3을 리턴해야 합니다. 만일 parameter가 주어지지 않으면 0을 리턴해야 합니다.

  2. what_is_my_full_name 함수는 주어진 parameter중 first_name 과 last_name 이라는 parameter를 조합하여 full name을 리턴해주어야 합니다.예를 들어, first_name이 "우성" 이고 last_name 이 "정" 이면 "정 우성" 라고 리턴하면 됩니다. Last name과 first name 사이에 space(빈칸)이 들어가 있어야 합니다.만일 last_name이 없거나 first_name이 없으면 둘 중하나만 리턴하면 됩니다.예를 들어, last_name이 없으면 "우성" 이라고 이름만 리턴하면 됩니다. 마지막으로, last_name과 first_name 둘다 없으면 "Nobody" 라고 리턴하면 됩니다.

model soluton

def sum_of_numbers(*numbers):
  return sum(numbers)
  
def what_is_my_full_name(**kwargs):
  if "first_name" in kwargs and "last_name" in kwargs:
    return f"""{kwargs["last_name"]} {kwargs["first_name"]}"""
  elif "first_name" in kwargs and "last_name" not in kwargs:
    return f"""{kwargs["first_name"]}"""
  elif "first_name" not in kwargs and "last_name" in kwargs:
    return f"""{kwargs["last_name"]}"""
  else:
    return "Nobody"
    
print(what_is_my_full_name(first_name="우성", last_name="정"))

Assignment for Nested Function (decorator)

greeting 함수에 적용될 decorator 함수를 구현하여 greeting 함수에 적용해주세요.
Greeting 함수가 호출 되었을때 decorator 함수에 parameter 값이 greeting 함수 리턴값의 다음에 붙혀져서 리턴되어야 합니다. Decorator 함수의 이름은 name_decorator 여야 합니다.

예를 들어, 다음 처럼 정의 하여 name_decorator decorator에 "정우성"을 parameter로 적용하여 greeting을 호출하면:

@name_decorator("정우성")
def greeting():
    return "Hello, "

greeting()

결과값은 다음과 같아야 합니다.

"Hello, 정우성"

my solution

  • r 을 변수로 두고 리턴. => 바로해도 문제없음
def name_decorator(name):
  def real_decorator(func):
    def wrapper():
      r = func() + name
      return r
    return wrapper
  return real_decorator

# what it would look like
@name_decorator("정우성")
def greeting():
  return "Hello, "

# 실행
greeting()

model solution

def name_decorator(name):
  def _decorator(func):
    def wrapper():
      result = func()
      return result + name
    return wrapper
  return _decorator

def greeting():
  return "Hello, "

greeting()
profile
🔰
post-custom-banner

0개의 댓글