Practice 8 : 자료 구조

종합소득세 계산하기

A라는 나라에서는 종합소득세는 과세표준 금액 구간에 따라 다른 세율이 적용된다.

즉, 1,300만원을 벌었을 경우 1,200*0.06 + 100*0.15를 계산한 결과가 납부해야 하는 세액이다.

납부해야하는 세금의 결과를 반환하는 함수 tax()를 작성하시오.

Screen Shot 2019-07-18 at 5 48 05 PM

과세표준액

세율

1,200이하

6%

1,200 ~ 4,600

15%

4,600 ~

35%


예시)

tax(1200) #=> 72.0
tax(4600) #=> 582.0
tax(5000) #=> 722.0
def tax(won):
    if won <= 1200:
        return won * 0.06
    elif won <= 4600:
        return 72 + (won - 1200) * 0.15
    else:
        return 582 + (won - 4600) * 0.35
# 아래의 코드를 실행하여 출력된 결과를 확인하시오.
print(tax(1200))
print(tax(4600))
print(tax(5000))
72.0
582.0
722.0

카쉐어링 요금 계산하기

카쉐어링 서비스는 요금을 다음과 같이 계산한다.

  1. 대여는 10분 단위로 가능하다.

  2. 대여 요금 : 10분당 1,200원

  3. 보험료 : 30분당 525원 (50분을 빌리면, 1시간으로 계산)

  4. 주행 요금 : km당 170원 (주행 요금은 100km가 넘어가면, 넘어간 부분에 대하여 할인이 50% 적용)

예) 160km를 달렸으면, 170*100 + 85 *60

양의 정수인 대여시간(분)과 주행거리를 받아 계산 결과를 반환하는 함수 fee()를 작성하시오.

참고 함수 math.ceil


예시)

fee(600, 50) #=> 91000
fee(600, 110) #=> 100350
import math

def fee(minute, distance):
    minute_fee = (minute/10)*1200
    if minute == 50:
        premium = 1050
    else:
        premium = (minute/30)*525
    if distance > 100:
        distance_fee = 170*100 + 85*(distance-100)
    else:
        distance_fee = 170 * distance
    return math.ceil(minute_fee + premium + distance_fee)
# 아래의 코드를 실행하여 출력된 결과를 확인하시오.
print(fee(600, 50))
print(fee(600, 110))
91000
100350

문자열 탐색

문자열 요소로만 이루어진 리스트를 넣었을 때, 문자열 길이가 2 이상이고 주어진 문자열의 첫번째와 마지막 문자가 같은 문자열의 수를 카운트하는 함수 start_end()를 작성하시오.


예시)

start_end(['level', 'asdwe', 's', 'abceda', 'gsdwrtfg']) #=> 3
def start_end(words):
    cnt = 0
    for word in words:
        if len(word) > 1 and word[0] == word[-1]:
            cnt += 1
    return cnt
# 아래의 코드를 실행하여 출력된 결과를 확인하시오.
print(start_end(['level', 'asdwe', 's', 'abceda', 'gsdwrtfg']))
3

Collatz 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측이다. 그 원리는 아래와 같다.

  1. 입력된 수가 짝수라면 2로 나눈다.

  2. 입력된 수가 홀수라면 3을 곱하고 1을 더한다.

  3. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복한다.

예를 들어, 입력된 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 된다.

위 작업을 몇 번이나 반복해야하는지 반환하는 함수 collatz()를 작성하시오 (단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환하시오.)


예시)

collatz(6) #=> 8
collatz(16) #=> 4
collatz(27) #=> 111
collatz(626331) #=> -1
def collatz(num):
    cnt = 0
    while True:
        if not num % 2:
            num /= 2
            cnt += 1
        elif num % 2:
            num = num*3 + 1
            cnt += 1
        if num == 1:
            return cnt
        if cnt >= 500:
            return -1
# 아래의 코드를 실행하여 출력된 결과를 확인하시오.
print(collatz(6))
print(collatz(16))
print(collatz(27))
print(collatz(626331))
8
4
111
-1

딕셔너리 뒤집기

딕셔너리는 기본적으로 key와 value로 이뤄져있다.

딕셔너리를 입력받아 value와 key를 뒤집은 결과를 반환하는 함수 dict_invert()를 작성하시오.


예시)

dict_invert({1: 10, 2: 20, 3: 30}) #=> {10: [1], 20: [2], 30: [3]}
dict_invert({1: 10, 2: 20, 3: 30, 4: 30}) #=> {10: [1], 20: [2], 30: [3, 4]}
dict_invert({1: True, 2: True, 3: True}) #=> {True: [1, 2, 3]}
def dict_invert(my_dict):
    new_dict = {}
    for k, v in my_dict.items():
        if new_dict.get(v):
            new_dict[v].append(k)
        else:
            new_dict[v] = [k]
    return new_dict
# 해당 코드를 통해 올바른 결과가 나오는지 확인하시오.
print(dict_invert({1: 10, 2: 20, 3: 30}))
print(dict_invert({1: 10, 2: 20, 3: 30, 4: 30}))
print(dict_invert({1: True, 2: True, 3: True}))
{10: [1], 20: [2], 30: [3]}
{10: [1], 20: [2], 30: [3, 4]}
{True: [1, 2, 3]}