※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2695번 문제인 공이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2694
2694번: 합이 같은 구간
첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 50)가 주어진다. 각 테스트 케이스는 첫째 줄에 수열의 크기 M이 주어진다. (1 ≤ M ≤ 10,000) 그 다음 줄부터는 그 수열에 들어있는 수가 주어지고, 한
www.acmicpc.net
수열의 길이가 최대 10000이므로, 각 구간의 합으로 나올 수 있는 후보는 많아야 10000가지이고, 그 수는 (전체의 합 / i) (i는 1 이상 10000 이하의 정수)로 나타나게 됨을 알 수 있다.
위의 가능한 모든 경우의 수에 대한 탐색으로 문제를 해결하자. 글쓴이는 set을 이용하여 구현하였다. set을 이용할 경우의 위 과정의 시간복잡도는 테스트케이스당 O(Mlg^2M)으로, 이는 시간제한 내에 충분히 문제를 해결할 수 있는 복잡도이다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <set>
using namespace std;
void solve() {
int N; cin >> N;
set<int> st; int total = 0;
for (int i = 0; i < N; i++) {
int x; cin >> x;
total += x;
st.insert(total);
}
for (int i = N; i > 0; i--) {
if (total % i) continue;
bool chk = 1;
int unit = total / i, psum = 0;
for (int k = 0; k < i; k++) {
psum += unit;
if (st.find(psum) == st.end()) {
chk = 0;
break;
}
}
if (chk) {
cout << unit << '\n';
break;
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
while (T--) solve();
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2698 // C++] 인접한 비트의 개수 (0) | 2023.04.22 |
---|---|
[BOJ 2697 // C++] 다음수 구하기 (0) | 2023.04.21 |
[BOJ 2695 // C++] 공 (0) | 2023.04.19 |
[BOJ 2696 // C++] 중앙값 구하기 (0) | 2023.04.18 |
[BOJ 14600 // C++] 샤워실 바닥 깔기 (Small) (0) | 2023.04.17 |