Sparta/CODEKATA

[250824] 파이썬 코테 01

junecho 2025. 8. 24. 04:29

💥  PERSONAL CODEKATA                                                                                      

기억에 남는 문제들만 기재

 

 

 

분수의 덧셈

 

from fractions import Fraction

def solution(numer1, denom1, numer2, denom2):
    if not (0 < numer1 and denom1 and numer2 and denom2 < 1000):
        print("제한사항을 어겼습니다.")
        exit()

    n1 = numer1/denom1
    n2 = numer2/denom2
    sumnum = n1+n2         # 1.25
    res = Fraction(sumnum).limit_denominator()   # 5/4
    dd = str(res).replace('/', ' ')
    dd2 = dd.split(' ')
    result = list(map(int, dd2))
    return result
    
print(solution(1,2,3,4))    # [5, 4]
print(solution(9,2,1,3))    # [29, 6]
print(solution(-9,2,1,3))   # 제한사항을 어겼습니다.

 

=>

소수점을 분자분모로 어떻게 변환하는지 검색해봄.

Fraction 함수를 사용하는 방법이 있어서 써봤는데, 코테 결과에서는 실패한 것도 나왔다. 흠 이 함수를 쓰는걸 원하는 게 아닌듯.

플머스에 유클리드 호제법 으로 풀린다고 해서 이걸로 다시 짜보겠음

# 유클리드고 뭐고 모르겠고 fraction 써서 풀었음
# 위는 fraction에서 다시 문자열 변환하고 replace쓰고 split쓰고 난리났는데, 
# 자체 기능에서 분자 분모만 불러오는게 있었음 XX.numerator, XX.denominator
from fractions import Fraction

def solution(numer1, denom1, numer2, denom2):     # 1.25
    res = Fraction(numer1, denom1) + Fraction(numer2, denom2)   # 5/4
    print(res)
    return [res.numerator, res.denominator]
# 유클리드 호제법 검색해도 수학수학해서 무슨 소린지 ..ㅋ..
# 유클리드 호제법으로 푼 코드

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

def solution(numer1, denom1, numer2, denom2):
    answer = [numer1 * denom2 + numer2 * denom1, denom1 * denom2]
    GCD = gcd(answer[0], answer[1])
    answer[0], answer[1] = answer[0] // GCD, answer[1] // GCD
    return answer

print(solution(9,2,1,3))

 

 

 

 

중앙값 구하기

# 버전1
from decimal import Decimal, ROUND_HALF_UP

def solution(mylist):
    if (len(mylist) % 2 == 0) or not (0 < len(mylist) < 100):
        print("제한사항을 어겼습니다.")
        exit()
        
    halfnum = (len(mylist) / 2)
    resultnum = Decimal(halfnum).quantize(Decimal('1'), rounding=ROUND_HALF_UP) -1
    x = int(resultnum)
    mylist.sort()
    return mylist[x]

myarray3 = [1, 2, 7, 10, 11, 4, 3]

print(solution(myarray3))

=>

0.5 에서 바로 반올림 되는걸 원했는데, round() 는 0.5에서 바로 반올림되지 않았음.

decial 모듈을 가져와야 해서 이걸 써봄.

리스트 길이 나누기 2 를 하고, 홀수가 무조건 나오니까 0.5에서 반올림 해서 . ....

...쓰는 도중에 그냥 소수점 버리면 되잖아? 라고 깨달음ㅋㅋ 바로 코드 수정함

int() 쓰면 소수점 무조건 버리게 되어있음

# 버전2
def solution(mylist):
    if (len(mylist) % 2 == 0) or not (0 < len(mylist) < 100):
        print("제한사항을 어겼습니다.")
        exit()

    halfnum = int(len(mylist) / 2)
    mylist.sort()
    return mylist[halfnum]

myarray3 = [1, 2, 7, 10, 11, 4, 3]

print(solution(myarray3))

 

 

 

 

최빈값 구하기

def solution(myarray):
    if not (0 < len(myarray) < 100) or not (0 <= x < 1000 for x in myarray):
        print("제한사항을 어겼습니다.")
        exit()

    mydict = {i: myarray.count(i) for i in myarray}
    print(mydict)
    maxvalue = max(mydict.values())

    if list(mydict.values()).count(maxvalue) > 1:
        maxkey = -1
    else:
        maxkey = max(mydict, key=mydict.get)
    return maxkey

▲ dict 에서 value 기준으로 max key 찾는 법 

 

 

 

 

~까지 완료