3752번 가능한 시험 점수
해결방법
반복문을 통해 가능한 경우의 수를 구하는 문제이다
N ≤ 100 이기 때문에, 완전탐색을 수행한다면,
O(2^100)
의 시간이 걸리므로 불가능하다조건을 분석한 뒤, 2중 반복문을 통해 해결할 수 있는 솔루션을 발견했다
⭐️ 솔루션 ⭐️
최대 배점은
100점
이고 최대 문제 수는100개
이기 때문에 최고 점수는10,000점
이다0점의 경우부터 탐색을 시작한다
초기에, 0점의 플래그를
true
로 설정한 뒤, 벡터에 넣는다각 배점을 반복문으로 돌며 아래와 같은 탐색을 수행한다
- 벡터의 값을 꺼내, 현재 배점을 더한다
- 만약 더한 값이 플래그 처리가 되지 않았다면, 플래그 처리 후 벡터에 넣는다
반복문을 모두 돌았다면, 벡터의 크기를 반환한다
소스코드
문제 해결 시간 : 1h 30m
메모리 : 12784 KB
시간 : 69 ms
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int testcase;
int n;
int score[101];
bool chk[10001];
vector<int> v;
int solve(){
chk[0] = true;
v.push_back(0);
for(int i=1; i<=n; i++){
int len = (int) v.size() - 1;
for(int j=len; j>=0; j--){
int now = v[j];
int nxt = now + score[i];
if(!chk[nxt]){
v.push_back(nxt);
chk[nxt] = true;
}
}
}
return (int)v.size();
}
int main(int argc, const char * argv[]) {
// cin,cout 속도향상
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> testcase;
for(int tc=1; tc<=testcase; tc++){
cin >> n;
for(int i=1; i<=n; i++){
cin >> score[i];
}
memset(chk, false, sizeof(chk));
cout << "#" << tc << " " << solve() << "\n";
v.clear();
}
return 0;
}
'Algorithm > SWEA 문제풀이' 카테고리의 다른 글
[SWEA] 4112번 이상한 피라미드 탐험 (0) | 2019.03.15 |
---|---|
[SWEA] 1767번 프로세서 연결하기 (0) | 2019.03.15 |
[SWEA] 2891번 분수 스도쿠 (0) | 2019.03.15 |
[SWEA] 4408번 자기 방으로 돌아가기 (0) | 2019.03.15 |
[SWEA] 4261번 빠른 휴대전화 키패드 (0) | 2019.03.15 |