PS(Problem Solving)/BOJ

[백준/BOJ] 2355번: 시그마

JunsuKim 2021. 11. 15.
728x90

https://www.acmicpc.net/problem/2355

 

2355번: 시그마

첫째 줄에 두 정수 A, B가 주어진다. (-2,147,483,648 ≤ A, B ≤ 2,147,483,647)

www.acmicpc.net

문제

두 정수 A와 B가 주어졌을 때, 두 정수 사이에 있는 수의 합을 구하는 프로그램을 작성하시오. 사이에 있는 수들은 A와 B도 포함한다.

입력

첫째 줄에 두 정수 A, B가 주어진다. (-2,147,483,648 ≤ A, B ≤ 2,147,483,647)

출력

첫째 줄에 답을 출력한다. (-2,147,483,648 ≤ 답 ≤ 2,147,483,647)

해설

처음 문제를 봤을 때는 반복문을 통해 A부터 B까지의 수를 다 더하면 되겠구나 하고 시도를 해보았다.

이 시도는 시간 초과가 떠 다른 방법으로 접근을 해야 했다.

떠오른 방법으로는 반복문을 돌리지 않고 수학 공식 중 등차수열일 때 두 수 사이의 합을 구하는 공식을 이용하는 것이다.

1부터 n 사이의 합 공식은 n(n+1)/2이다.

이것을 풀어보면 (수의 개수) * (마지막 수 + 처음 수) / 2이다.

이 공식을 문제에 적용해보면 A가 B보다 작거나 같을 때 (B - A + 1 ) * (B + A) / 2이고, 

A가 B보다 크다면 (A - B + 1) * (A + B) / 2를 하면 된다.

소스 코드

fun main() {
    val input = readLine()!!.split(" ")
    val a = input[0].toLong()
    val b = input[1].toLong()
    var result: Long = 0
    if(a <= b) result = (b - a + 1) * (b + a) / 2
    else result = (a - b + 1) * (a + b) / 2
    println(result)
}
728x90

댓글