Olive Study Room
[백준 알고리즘] #8958번 : 가우스 함수, compactMap, reduce 본문
처음에 제출한 코드
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
'cs > 알고리즘' 카테고리의 다른 글
[백준 알고리즘] 6. 함수 (0) | 2021.06.26 |
---|---|
[백준 알고리즘] #4673번 : 셀프넘버, set.remove (0) | 2021.06.25 |
[백준 알고리즘] 5. 1차원 배열 (0) | 2021.06.20 |
[백준 알고리즘] #2577번 : 정수가 포함하는 숫자 개수 출력 / forEach (0) | 2021.06.19 |
[백준 알고리즘] #10818번 : 배열/속도 향상 (0) | 2021.06.19 |
Comments