
어찌저찌 다 풀었는데, 잘풀었는지 잘 모르겠다 🥲
내 기준 약간의 노가다식 코드인 느낌,,
게다가 연말이라고 펑펑 놀았더니
손이 그새 느려져서 푸는데 무려 1시간 30분이나 걸렸...
이름이 tmp인 크기가 0인 리스트 데이터를 만드시오.
tmp = []
어렵지 않은 문제로 설명 생략
data_type 이라는 이름의 데이터형을 판별하는 함수를 작성해 주세요.
이 함수는 하나의 입력을 받아서 데이터형을 알아내야 합니다.
Int, float, string, list, dict, tuple 등을 알아야 하며,
만약 list 형 데이터라면 list
형 데이터 안에 있는 각 데이터의 데이터타입도 반환해야 합니다.
아래 실행 예시를 확인해 주세요
> data_type(1)
int
> data_type(5.)
float
> data_type([2, 3, [2, 3], "Hello"])
list, <int, int, list <int, int>, string>
def data_type(n):
result = ""
def type(n):
if isinstance(n, int):
result = 'int'
elif isinstance(n, float):
result = 'float'
elif isinstance(n, str):
result = 'str'
elif isinstance(n, list):
result = 'list'
elif isinstance(n, tuple):
result = "tuple"
elif isinstance(n, dict):
result = "dict"
return result
if isinstance(n,(int,float,str)):
result = type(n)
elif isinstance(n, (list,tuple,dict)):
result = type(n)
result += ',<'
for i in n :
result += data_type(i) + ','
result = result [:-1]
result += '>'
return result
정말 가장 시간을 많이 쓴 문제..
함수안의 함수로 풀이한 이유는 2가지가 있는데,
1. 처음에 하나의 함수에 데이터 타입을 확인하고, 리스트 튜플일경우 for문으로 분리 후
다시 데이터 타입을 확인하게끔 코드를 작성하였으나,
중복되는 코드가 많아 재귀함수로 변경
2. 재귀함수를 썼더니 data를 담는 result가 계속 reset되서 이다.
이외 문자열을 맞추기 위해 ,<를 넣거나 >를 추가해주는등의 코드를 추가했다.
우리나라와 달리 미국은 간단한 식사만 해도 팁을 주는 문화가 있습니다.
그래서 팁을 계산하는 함수를 만들면 좋겠습니다.
팁은 함수에서 입력 받도록 하죠.
팁을 계산하는 함수는 calc_tips라는 이름으로 하고, 입력은 전체 금액, 팁 비율로 하면 되겠네요.
혹시 사용자가 팁 비율을 입력하지 않으면 디폴트로 10%를 적용하도록 해주세요.
그런데, 1달러 단위로 딱딱 떨어졌으면 좋겠습니다. 동전을 들고 다니는건 불편하니까요.
그래서 만약 계산했는데, 5.6달러가 나오면 그냥 6달러로, 5.1달러가 나와도 그냥 6달러로 계산하도록 해주세요.
함수의 결과는 return이 아니라 print가 되도록 해주세요.
def calc_tips(total_price, rate = 10):
import math
result = math.ceil(total_price * rate * 0.01)
return result
반올림이 아닌 올림으로 처리해야하기때문에
math 모듈을 사용했다.
팁 비율은 디폴트로 10이되고 적고,
음식 가격을 입력하면 팁이 return되게 코드를 작성했다.
여러 문장으로 된 문서를 입력받아서 매칭되는 문자열의 횟수와 해당 문자열의 위치(index)를 알려주는 search_target이라는 이름의 함수를 작성해주세요.
예)
> sentence = "Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex."
> target = "than"
> search_target(sentence, target)
3, [20, 50, 82]
def search_target(sentence, target):
idx_list = []
cnt = 0
tmp = 0
sentence_list = sentence.split()
for string in sentence_list :
if string == target :
cnt += 1
n = 0
while n < len(sentence) :
sentence_list = sentence.split()
if target in sentence_list :
idx = sentence.find(target)
idx_list.append(idx+tmp)
sentence = sentence[idx + 1:]
tmp += idx+1
continue
n += 1
result = str(cnt) + ',' + str(idx_list)
return result
문자열의 횟수는 split메소드를 사용해 비교적 쉽게 알 수 있었다.
문자열의 위치의 경우 find메소드를 이용할 수 있는데,
find메소드는 첫번째 위치만 반환하기때문에 반환된 idx위치를 변수에 담고 슬라이스를 이용해 앞부분을 잘라주었다.
그 다음에 위치한 idx번호의 경우 잘라낸 만큼 더해주어야 원문의 위치가 되기때문에 tmp에 미리 이전 idx위치를 담아서 더해준 뒤 idx_list에 담아서 반환했다.
여러분들은 div_ab라는 이름의 함수를 하나 만들어 주세요.
이 함수는 입력 인자로 a, b를 받으며, 받은 인자의 첫 번째를 a, 두 번째를 b라고 합니다.
이 함수는 입력 인자가 꼭 정수여야 하며, 함수 코드 내부에서
정수인지 아닌지를 판별하도록 해서 정수일 때만 나눗셈을 수행하도록 해주세요.
함수의 출력(return)은 없고, 함수의 마지막에 print 문으로 a / b를 계산하는 나눗셈의 결과를 출력하는 함수입니다.
출력의 형태는 정확하게는 몫과 나머지를 구하는 함수입니다.
출력의 첫 번째 항은 몫, 두 번째 항은 나머지가 되도록 코드를 작성해 주세요.
여러분에게 한 가지 안타까운 소식은 div_ab라는 함수를 만들 때 나눗셈 기호( / )나
어떤 모듈이든 나눗셈을 직접 수행하는 명령을 사용할 순 없습니다. 나눗셈 명령 없이 나눗셈을 수행해 주세요.
> div_ab(3, 2)
3나누기 2의 결과 : 몫 1, 나머지 1
def div_ab(a,b):
div = 0
mod = 0
if isinstance(a,int) and isinstance(b,int) :
big = max(a,b)
sma = min(a,b)
while big >= sma :
big -= sma
div += 1
mod = big
print(f'{a} 나누기 {b}의 결과 : 몫{div}, 나머지{mod}')
나눗셈을 이용하지 않고 나누는 함수를 만드는 문제.
우선 함수에서 받은 a,b가 int인지 판별할 수 있도록
if문에 and조건으로 필터를 걸어주고
큰 수를 big이라는 변수에
작은 수를 sma이라는 변수에 담아주었다.
big이 sma보다 작을 때까지 빼주는데 빼줄때마다 div(값 변수)에 +1로 몫을 계산하고
빼고 남은 수를 나머지인 mod에 담아서 print 해주었다.
즉, 뺀 횟수 = 몫 / 남은 수 = 나머지인셈이다.
하노이탑 문제가 있습니다.
아래 첨부된 사진의 글자가 흐릿하지만 신경쓰지 않아도 됩니다.
아래 그림을 설명해 보겠습니다.
크기 순으로 쌓여있는 원반 세 개가 있습니다.
이 원반은 A, B, C 장소 중 현재는 A에 있습니다.
하노이 탑 문제는 작은 원반 위에 큰 원반이 올려질 수 없다는 것과 한 번에 하나만 옮길 수 있다는 것을 지켜야 합니다.
A에서 C로 갑자기 건너가는 것은 괜찮습니다.
여러분은 Python으로 아래 그림에 묘사된 하노이 탑 문제를 풀어야 합니다.
여러분의 문제는 하노이탑 원반의 개수는 n개입니다.
이 n개의 원반을 B 지점 혹은 C 지점으로 옮길 수 있어야 합니다.
즉, 하노이탑 문제를 풀 여러분이 작성해 주어야할 함수는 원반의 개수(n)와 어디서 원반이 시작하고(start_point) 어디서
옮기는지(end_point)를 입력받아야 합니다
def hanoi_sol(cnt,start_point,end_point,via_point=tmp):
if start_point == 'A' :
if end_point == 'B' :
tmp = 'C'
elif end_point == 'C' :
tmp = 'B'
else :
if end_point == 'B' :
tmp = 'A'
elif end_point == 'C' :
tmp = 'A'
if cnt == 1:
print(f'{start_point} -> {end_point}')
return
else :
hanoi_sol(cnt-1,start_point,tmp,end_point)
print(f'{start_point} -> {end_point}')
hanoi_sol(cnt - 1, tmp, end_point,start_point)
하노이탑은 잘 소화가 되지 않아서
루틴? 을 보고 풀었는데 문제는 경유값을 넣을 수 없기때문에
via_point에 tmp로 디폴트를 주고
end_point가 B일 경우, via_point(경유)는 C
end_point가 C일 경우, via_point(경유)는 B
라는 if문을 넣어주었다.
다만 두번째 if문 else구문에 tmp가 start가 되는 재귀가 들어가기때문에 start_point가 A일 경우라는 if중복구문을 추가하였다.