알고리즘_PS/Baekjoon

[Baekjoon] 21921 블로그 - C++

hanseongjun 2022. 8. 11. 18:59

> 문제

< 문제에 있는 사진, 어디서 많이 본 듯 하다 >

문제 링크 : 

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

 

21921번: 블로그

첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다

www.acmicpc.net

문제 요약 : 총 n개의 방문자 수가 주어질 때, x일간 방문한 최대 방문자수와 그 방문자수가 있는 구간의 개수를 구하여라.


> 풀이들

  1. 첫 번째 풀이 : 구간 x 안에 있는 사람들의 합을 각각 구하고, 그걸 n - x + 1번만 반복하면 되는 줄 알았다. 하지만 시간 초과가 떠서 다른 방법을 생각해야만 했다. (시간 복잡도가 O(n-x+1) * O(x) => O(x*n)이 나와버림)
  2. 두 번째 풀이 : 구간 x 안에 있는 사람들의 합을 DP를 이용해 구하면 O(1)만에 구할 수 있다. 
    arr[0]  = arr[0], arr[1] = arr[0] + arr[1], arr[2] = arr[2] + arr[1], ... 이런 식으로 가다 보면 i번째부터 i+x-1번째 사람까지의 합은 arr[i+x-1] - arr[i-1]이다. => O(1)만에 해결 가능!

전체 코드는 다음과 같다.

https://github.com/siejwkaodj/Problem-Solve/blob/main/Baekjoon/Silver%203/21921.cpp

 

GitHub - siejwkaodj/Problem-Solve

Contribute to siejwkaodj/Problem-Solve development by creating an account on GitHub.

github.com

코드는 c++로 구현하였다.


> 느낀점

DP를 이용해 구간합을 O(1)만에 구한다는 점이 특징인 문제였다.

이전에 이 문제를 푼 것이 많은 도움이 되었다.

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

 

11660번: 구간 합 구하기 5

첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네

www.acmicpc.net

 

LIST