문제 출처 : https://www.acmicpc.net/problem/17214
언어 : Kotlin
문제 설명 :
다항식(polynomial)은 문자의 거듭제곱의 상수 배들의 합을 표현하는 수식이다. 예를 들어 x2+2x+3 같은 식을 의미한다. 그중 변수가 하나인 것을 일변수 다항식이라고 하고 이는 다음과 같이 표현한다.
f(x) = axn + bxn-1+...+cx+d
최대 일차 일변수 다항식이 주어졌을 때 그 함수를 적분한 결과를 출력하는 프로그램을 작성하시오.
입력 :
첫째 줄에 최대 일차 일변수 다항식이 주어진다. 항의 개수는 최대 2개이고, 변수는 항상 x로 주어지며, 각 항은 공백 문자로 구분되지 않는다. 주어지는 계수는 절댓값이 10,000을 넘지 않는 0이 아닌 2의 배수이고 주어지는 상수는 절댓값이 10,000을 넘지 않는 정수이다. 차수가 같은 항은 한 번만 주어진다. 단, 계수의 절댓값이 1인 경우에는 1을 생략한다. 다항식은 차수가 큰 것부터 작아지는 순서대로 주어진다.
출력 :
주어진 일변수 다항식을 적분한 결과를 입력 형식과 동일하게 출력한다. 적분상수는 "W"로 x2은 "xx"로 표현한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 256MB
입출력 예 :
입력 | 출력 |
6x+6 | 3xx+6x+W |
풀이 :
입력 받은 문자열을 정규식을 통해 나눈다.
계수가 있는 선형 항과 상수 항을 나누고, 다항식이 0인지 확인한다.
0이라면 일차항이 없고 상수항만 0이 있으므로 W를 출력한다.
첫번째로 일차항이 존재한다면, 계수와 x를 제외한 숫자부분을 전부 추출해 2로 나눈다.
값이 1이나 -1일 경우 xx나 -xx로 표현해준다.
두번째로 상수항이 존재하고 0이 아닐 경우, 상수항에 x를 붙인다.
다만, 상수 항이 1이면 x를, 부호가 존재할 경우 부호를 붙여서 x를 추가한다.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val polynomial = readLine()
var result = ""
val linearTermRegex = Regex("-?\\d+x")
val constantRegex = Regex("[-, +]?\\d+$")
val linearTerm = linearTermRegex.find(polynomial)?.value
val constant = constantRegex.find(polynomial)?.value
var num: String?
if (polynomial == "0") {
result = "W"
} else {
if (linearTerm != null) {
num = (linearTerm.substring(0, linearTerm.length - 1).toInt() / 2).toString()
val sign = if (num[0].isDigit() || num[0] == '+') "" else "-"
result += if (num == "1" || num == "-1") sign + "xx" else num + "xx"
}
if (constant != null) {
num = constant
if (num != "+0" && num != "-0") {
val sign = if (num[0].isDigit() || num[0] == '+') "+" else "-"
result += when (num) {
"1" -> "x"
"-1", "+1" -> sign + "x"
else -> num + "x"
}
}
}
result += "+W"
}
bw.write(result)
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
16113번: 시그널 (0) | 2024.06.12 |
---|---|
27522번: 카트라이더: 드리프트 (0) | 2024.06.12 |
3486번: Adding Reversed Numbers (0) | 2024.06.11 |
2179번: 비슷한 단어 (0) | 2024.06.11 |
27930번: 당신은 운명을 믿나요? (0) | 2024.06.10 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!