Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Olive Study Room

[백준 알고리즘] #8958번 : 가우스 함수, compactMap, reduce 본문

cs/알고리즘

[백준 알고리즘] #8958번 : 가우스 함수, compactMap, reduce

Olive Dev 2021. 6. 23. 01:35

 

처음에 제출한 코드

let line = Int(readLine()!)!
for _ in 1...line {
    var score: Int = 0
    let result = readLine()!.split(separator: "X")
    for i in 0...result.count-1 {
        var scorePlus: Int = 1
        result[i].forEach({_ in
            score += scorePlus
            scorePlus += 1
        })
    }
    print(score)
}

1. X를 기준으로 찢어주고

2. 각 배열 내에서 char 하나씩 짚어가며 scoreplus를 하나씩 늘리며 더한다.

3. 이 scoreplus를 합친 score를 프린트한다.

 

런타임 에러가 난다.

 

 

아마 각 배열에 모든 char(O 하나하나)를 넘어갈 때마다 1씩 더해줘서 시간이 오래걸리는 듯 하다.

검색하면서 가우스 함수에 대해 알게 되었다.

 

 

1에서 100까지를 더할 때

1 + 100 = 101

2 + 99 = 101

.

.

이렇게 모두 같기 때문에 101 x 50을 하면 되는 것!

101 x 50 = (a+1)*(a/2) 이와 같다.

 

 

 

이 문제에서는 O의 개수에 따라 더하기 때문에 각 배열의 count(O의 개수)를 받아서 처리할 수 있다.

그리고 배열로 이 결과(이전 코드에서의 scoreplus)를 따로 받아와서 합치기보다는

reduce함수를 통해 한번에 받아오는게 빠르다.

 

 

 

 

수정한 결과

let line = Int(readLine()!)!
for _ in 1...line {
    print(readLine()!.split(separator: "X").map{ $0.count * ($0.count+1)/2}.reduce(0, +))
}

 


 

다른 사람들 코드를 보다가 map대신 compactMap을 사용한 경우도 있었다. 

compactMap, flatMap, map의 차이도 알아보도록 한다.

 

아래 글 참고!

https://pengcoder.tistory.com/41

 

Comments