728x90
반응형
https://www.codewars.com/kata/540d0fdd3b6532e5c3000b5b/train/python
이 문제는 (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 |