[백준] 17217 - 다항 함수의 적분

Kyojun Jin·2022년 1월 21일
0

다항 함수의 적분

생각 흐름

  1. 문자열 파싱을 정규식으로 구현하자.
  2. 문제 입력 조건을 잘 보고 다항식이 어떻게 주어지는지 파악
  3. 계수가 1이 될 때 예외 처리
  4. 0 넣을 때 예외 처리

풀이

문제에서 다항식은 최대 2개
같은 차수는 중복x
일차항 계수의 절대값은 2의 배수라고 하였다.

일단 입력값의 항이 두 개라고 할 때
입력값은 "계수x 연산기호 상수"로 나타낼 수 있다.

계수는 숫자 여러개, \d+로 표현할 수 있다.
하지만 음수가 될 수 있으므로, -?\d+가 될 것이다.

연산기호는 + 아니면 - 이므로 [+-]로 표현할 수 있다.

상수는 숫자 여러개이므로 \d+이다.

여기까지 하면 -?\d+x[+-]\d+이 된다.

여기서 내가 원하는 부분을 빼오기 위해서 필요한 부분을 그룹으로 묶는다.

내가 필요한 것은

  1. 첫째 항의 부호
  2. 첫째 항의 계수의 절대값
  3. 일차항 여부
  4. 상수 여부
  5. 일차항과 상수 사이의 기호
  6. 상수

이다.

위 순서대로 그룹으로 묶으면

  1. (-?)\d+x?[+-]\d+
  2. (-?)(\d+)x?[+-]\d+
  3. (-?)(\d+)(x?)[+-]\d+
  4. (-?)(\d+)(x?)([+-]\d+)?
  5. (-?)(\d+)(x?)(([+-])\d+)?
  6. (-?)(\d+)(x?)(([+-])(\d+))?

최종적으로 내가 필요한 정규식은 (-?)(\d+)(x?)(([+-])(\d+))? 이 된다.
이것으로 re.search(pattern, p).groups()을 거쳐서 얻은 값에
위 인덱스로 알고 싶은 것들을 얻을 수 있다.

또한 함수 적분(n, e)를 nxenx^e의 적분이라고 하자.
계수를 e+12\frac{e + 1}{2},
변수를 '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()

0개의 댓글