BoJ 4682 - Polynomial Showdown [with Python / 문제 한국어로 번역]

ssook·2023년 10월 2일
0

BoJ 문제기록

목록 보기
22/29
post-thumbnail

📍 문제

다음과 같은 규칙에 따라, 상수항부터 8차까지의 다항식의 계수가 주어집니다.
당신은 해당 다항식의 계수를 다항식으로 정리해야 합니다:

  1. 차수의 내림차순으로 다항식이 나열되어야 합니다.
  2. 지수는 "^" 다음에 나와야 합니다.
  3. 상수항은 상수로만 표시되어야 합니다.
  4. 계수가 0이 아닌 항목만 나와야 하며, 모든 항목이 0인 계수일 경우 상수항만 나와야 합니다.
  5. 이항 연산자 "+"와 "-" 양쪽에는 하나의 공백만 있어야 합니다.
  6. 선행 항목이 양수이면 부호가 없어야 하며, 선행 항목이 음수이면 앞에 "-" 기호가 나와야 합니다. 예를 들어, -7x^2 + 30x + 66과 같이 표시되어야 합니다.
  7. 해당 항목이 음수라면, 음수항을 합산한 항목으로 표시하는 것이 아니라 음수항만을 단독으로 표기해야 합니다.
    다시 말해, x^2 + -3x와 같이 나오면 안 되며, x^2 - 3x와 같이 표시되어야 합니다.
  8. 상수 1과 -1은 상수항으로만 나와야 합니다.
    다시 말해, -1x^3 + 1x^2 +3x^1 - 1과 같이 나오면 안 되며, -x^3 + x^2 + 3x -1과 같이 표시되어야 합니다.

예를 들어, 계수가 0, 0, 0, 1, 22, -333, 0, 1, -1인 경우 다항식은 x^5 + 22x^4 - 333x^3 + x - 1과 같이 표시되어야 합니다.

입력

입력 파일에는 하나 이상의 줄이 있으며, 각 줄에는 하나 이상의 공백으로 구분된 계수가 있습니다.
각 계수는 절대값이 1000 미만인 정수입니다.
각 줄에는 아홉 개의 계수가 포함되어 있습니다.

출력

출력 파일은 각 줄마다 위의 규칙을 만족하는 다항식을 출력해야 합니다.


📍 아이디어

실버5의 구현 문제지만, 은근히 손이 많이 갔던 문제.

일단 첫 항의 경우 플래그를 사용해서 첫 항일 경우와, 아닌 경우를 나눠 출력했다.
그 후 부호 앞에 양 옆으로 공백이 있어야 했기에(...)
각 항의 부호를 따져 그에 맞게 공백을 직접 넣어주었다.
그리고 계수가 1일 경우 1x 이런 식으로 출력되면, 안 되므로 해당 부분 관련해서도 모든 차수에서 제대로 출력될 수 있게끔 작업을 따로 해주었다.

정리하자면,

  1. 첫 항일 경우 처리
  2. 첫 항이 아닐 경우 부호 처리
  3. 계수가 1일 경우 계수 처리

이걸 고려해서 분기 처리를 하나씩 하면서 구현하면 된다.

그리고 역순으로 다항식을 출력해야 하므로 역순으로 입력 값을 돌아야 하며, EOFError 처리도 해줘야 한다.
마지막으로 모든 계수가 0일 경우 0이 나와야 한다! 놓치면 안 되는 포인트.


📍 제출코드

def read_next():
    coef = []
    try:
        coef = list(map(int, input().split()))
    except EOFError:
        return None
    return coef[::-1]

def print_it(coef):
    i_first = True
    for i in range(8, -1, -1):
        if coef[i] or i == 0:
            sign = 1 if coef[i] > 0 else (-1 if coef[i] < 0 else 0)
            if not sign and (i or not i_first):
                continue
            if sign == -1:
                print(("-" if i_first else " - "), end="")
                coef[i] *= sign
            elif not i_first and sign:
                print(" + ", end="")
            if coef[i] != 1 or not i:
                print(abs(coef[i]), end="")
            if i:
                print(("x^" + str(i) if i > 1 else "x"), end="")
            i_first = False
    print()

if __name__ == "__main__":
    while True:
        coefficients = read_next()
        if coefficients is None:
            break
        print_it(coefficients)

profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글

관련 채용 정보