문제에서 다항식은 최대 2개
같은 차수는 중복x
일차항 계수의 절대값은 2의 배수라고 하였다.
일단 입력값의 항이 두 개라고 할 때
입력값은 "계수x 연산기호 상수"로 나타낼 수 있다.
계수는 숫자 여러개, \d+
로 표현할 수 있다.
하지만 음수가 될 수 있으므로, -?\d+
가 될 것이다.
연산기호는 + 아니면 - 이므로 [+-]로 표현할 수 있다.
상수는 숫자 여러개이므로 \d+
이다.
여기까지 하면 -?\d+x[+-]\d+
이 된다.
여기서 내가 원하는 부분을 빼오기 위해서 필요한 부분을 그룹으로 묶는다.
내가 필요한 것은
이다.
위 순서대로 그룹으로 묶으면
(-?)\d+x?[+-]\d+
(-?)(\d+)x?[+-]\d+
(-?)(\d+)(x?)[+-]\d+
(-?)(\d+)(x?)([+-]\d+)?
(-?)(\d+)(x?)(([+-])\d+)?
(-?)(\d+)(x?)(([+-])(\d+))?
최종적으로 내가 필요한 정규식은 (-?)(\d+)(x?)(([+-])(\d+))?
이 된다.
이것으로 re.search(pattern, p).groups()
을 거쳐서 얻은 값에
위 인덱스로 알고 싶은 것들을 얻을 수 있다.
또한 함수 적분(n, e)를 의 적분이라고 하자.
계수를 ,
변수를 'x' * (exp + 1)
로 구현하면 된다.
이때 계수가 1이면 1이 아닌 빈 문자열을 붙이면 된다.
만약 계수가 0인 채로 왔다면 그냥 빈 문자열을 반환하면 된다.
최종적인 구현은 아래와 같다.
항은 1개 이상이므로
정답은 0값 + 적분(1값, 2값 길이) 이다.
거기서 3값이 존재하면 (상수 존재)
정답 += 4값 + 적분(5값, 0)
마지막으로 적분상수 W를 더해주면 된다.
이때 마지막 예외처리로 입력이 0이라면 그냥 W을 출력하면 된다.
적분 함수에서 계수가 0일 때 빈 문자열을 반환하는 예외 처리를 안 해도 통과가 된다.
예상컨대 항이 두 개 이상일 때 상수값을 0으로 주진 않는 것 같다.
(수학적으로는 잘못된 입력이지만 문제 설명에 따르면 3x+0을 입력해도 할 말은 없다.)
그래도 혹시 몰라 코드엔 추가해두었다.
import re
import sys
def solution():
p = sys.stdin.readline().strip()
if p == '0':
sys.stdout.write('W')
return
reed = re.search("(-?)(\d+)(x?)(([+-])(\d+))?", p).groups()
answer = reed[0] + integral(int(reed[1]), len(reed[2]))
if reed[3] is not None:
answer += "%s%s" % (reed[4], integral(int(reed[5]), 0))
answer += '+W'
sys.stdout.write(answer)
def integral(coefficient, exp):
coefficient //= (exp + 1)
return ('' if coefficient == 1 else str(coefficient)) + ('x' * (exp + 1))
solution()