프로그래밍/PS
[C++] 백준 1806번: 부분합
유태정
2021. 9. 5. 22:59
반응형
https://www.acmicpc.net/problem/1806
골드4라기에는 난이도가 쉬운 편인 것 같다. 두 포인터라는 알고리즘 분류로 돼 있다. 나는 이름만 보고는 흔히 생각하는 start와 end를 0부터 N - 1까지 각각 훑는 O(N^2) 알고리즘인가 싶었다. 하지만 검색해서 알아보니 O(N) 알고리즘이었다.
https://ssungkang.tistory.com/entry/Algorithm-Two-Pointers-%ED%88%AC-%ED%8F%AC%EC%9D%B8%ED%84%B0
end를 start부터 훑는게 아니라 구간 합이 S보다 작을 때까지 end를 증가하다가 S와 같거나 커지면 start를 늘리는 방식이었다. 생각해보니 end를 start부터 훑으면 구간 합이 작은 것부터 다시 계산하니 필요없는 연산량이 많아지는구나 깨달았다. 아무튼, 위에 소개된 방식으로 구현했더니 시간초과가 발생했는데, 이유는 쉽게 알 수 있었다. 0부터 i까지의 누적합을 구해두지 않아 중복 연산이 많아졌기 때문이다. 누적합까지 미리 계산해서 제출하니 쉽게 AC를 받을 수 있었다.
반응형