알고리즘/코드워

[python] Binomial Expansion

(ㅇㅅㅎ) 2023. 1. 16. 15:17
728x90
반응형

 

https://www.codewars.com/kata/540d0fdd3b6532e5c3000b5b/train/python

 

Codewars - Achieve mastery through coding practice and developer mentorship

A coding practice website for all programming levels – Join a community of over 3 million developers and improve your coding skills in over 55 programming languages!

www.codewars.com

 

 이 문제는 (ax+b)^n 식을 풀어서 적는 것입니다. 예를 들어 (x+1)^2의 경우 답은 x^2+2x+1입니다.

⭐ 처음에는 모든 값을 쪼개어서 찾았는데 정규표현식을 이용하면 더 쉽게 풀 수 있습니다.

 

👀 코드

def expand(expr):
    # 괄호 없애고 ^로 나누어서 분리
    tmp = expr.replace('(', '').replace(')', '').split('^')
    # 지수가 0이면 '1', 1이면 원래 값 반환
    if tmp[1] == '0': return '1'
    elif tmp[1] == '1': return tmp[0]

    # 지수가 1보다 크면 계산
    else:
        # (ax+b)^n
        # 지수 저장
        n = int(tmp[1])

        # 지수 값에 따라서 달라지는 곱해지는 계수 및 상수 구하는 계산
        # : (x+1)^2 = x^2+2x+1 : [1, 2, 1]
        # 계수 : coefficient
        cs = [1, 1]
        for i in range(n + 1):
            cs = [1] + [cs[j]+cs[j+1] for j in range(i-1)] + [1]

        # x, a와 b 구하기 구하기
        a, x, b = 0, '', 0
        for idx, i in enumerate(tmp[0]):
            if i.isalpha():
                x = i
                a = 1 if tmp[0][:idx] == '' else (-1 if tmp[0][:idx] == '-' else int(tmp[0][:idx]))
                b = int(tmp[0][idx+1:])
                break

        # 계산하기
        result = ''
        for idx, c in enumerate(cs):
            # 지수
            new_n = n - idx
            # 계수
            new_c = c * pow(a, new_n) * pow(b, idx)

            # 계수 1, 지수 0이면 1표현, 나머지는 계수
            gyesu = '1' if new_c == 1 else ('-' if new_c == -1 else str(new_c))
            # 지수가 1이면 x만 표현, 나머지는 x+^지수 표현
            jisu = x + ('' if new_n == 1 else f'^{new_n}')

            # 부호 + 계수 + 지수
            # 부호 : 계수가 0보다 작거나 idx가 영 : ''/그 외 '+'
            # 계수 : 지수!=0 and 계수==1 : ''/그 외 : 계수
            # 지수 : 지수==0 : ''/그 외 : 지수
            result += ('' if new_c<0 or idx==0 else '+')+\
                      ('' if new_n !=0 and new_c == 1 else gyesu) + \
                      ('' if new_n == 0 else jisu)
    return result

 

👀 정규표현식으로 a, x, b, n을 찾으면

import re
P = re.compile(r'\((-?\d*)(\w)\+?(-?\d+)\)\^(\d+)')
a, x, b, n = P.findall(expr)[0]
반응형

'알고리즘 > 코드워' 카테고리의 다른 글

[python] Two's Complement  (0) 2023.07.18
[python]Can you sum?  (0) 2022.12.06
[python]Squash the bugs  (0) 2021.03.08
[python]Holiday VI - Shark Pontoon  (0) 2020.12.03
[python]Exclusive "or" (xor) Logical Operator  (0) 2020.12.02