Uknow's Lab.
article thumbnail

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

 

2355번: 시그마

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

www.acmicpc.net

 

난이도 : 브론즈 2
태그 : 수학, 사칙연산

 

 

설명

 A 부터 B 까지의 합을 구하는 문제이지만, 단순히 for문을 사용해 구할 경우 시간초과가 납니다.

 (-2,147,483,648 ≤ A, B ≤ 2,147,483,647)

A, B의 범위가 매우 크기 때문이죠.

for문을 사용해 구하게 될 경우 매우 많은 연산을 수행하게 될 수 있습니다.

 

그렇다면 어떻게 해야 할까요? 힌트는 문제 제목에 있습니다.

1부터 n까지의 합을 구하는 유명한 공식이 하나 있습니다.

 

 

위 공식을 사용한다면 적은 연산 횟수로 해를 찾아낼 수 있으며,

a ~ b 까지의 합 -> (1 ~ b 까지의 합) - (1 ~ a 까지의 합)으로 쉽게 구할 수 있습니다.

 

 

 

소스코드

fun main() {
    val line = readLine()!!.split(" ")
    var a = line[0].toLong()
    var b = line[1].toLong()

    var result:Long =
        if (a < b) (b * (b + 1)) / 2 - (a * (a - 1) / 2)
        else (a * (a + 1)) / 2 - (b * (b - 1) / 2)

    print(result)
}

 

주의할 점은, 항상 a < b인 것은 아니기 때문에 둘 중 어떤 수가 더 큰지 확인해야 합니다

 

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.