이 글은 "문제 해결력을 높이는 알고리즘과 자료구조" 책을 읽고 간단하게 주관적인 중요한 부분만 정리한 글입니다.
실제로 알고리즘을 구현하지 않아도 계산 시간이 얼마나 걸릴지 어림짐작할 수 있는 척도 역할을 하는 것
알고리즘을 설계하기 전에는 다음 내용을 미리 확인해야 합니다.
위와 같은 내용을 알고 있으면 복잡도를 어느 정도까지 허용할 수 있는지 역산할 수 있습니다.
일반적인 1초 간 처리 가능한 계산 횟수는 회 정도입니다.
점근적 상한선(asymptotic upper bound)
으로 아무리 나쁜 상황이더라도 비교 함수보다 같거나 좋다는 뜻입니다.min_value
변수에 지금까지 확인한 값 중 가장 작은 값을 저장합니다.앞선 문제보다 조금 더 발전된 다음과 같은 문제를 생각해 봅시다.
이런 문제는 이중 for문을 사용하면 풀 수 있습니다.
→ 모든 경우의 수를 조사해 보는 것이죠.
부분 합 문제와 같은 것들은 부분 집합 개를 모두 조사하면 풀 수 있습니다.
→ 아래와 같이 정수의 이진법 표현인 비트 연산을 사용하는 방법도 있습니다.
//
// Created by 최우영 on 2022/07/12.
//
#include <iostream>
#include <vector>
using namespace std;
void code_3_6() {
// 입력
int N, W;
cin >> N >> W;
vector<int> a(N);
for (int i = 0; i < N; ++i) {
cin >> a[i];
}
// bit는 2^N개 존재하는 부분 집합 전체를 대상으로 동작
bool exist = false;
for (int bit = 0; bit < (1 << N); ++bit) {
int sum = 0; // 부분 집합에 포함된 요소의 합
for (int i = 0; i < N; ++i) {
// i번째 요소 a[i]가 부분 집합에 포함되는지 여부
if (bit & (1 << i)) {
sum += i;
}
}
// sum이 W와 일치하는지 여부
if (sum == W) exist = true;
}
if (exist) cout << "Yes" << endl;
else cout << "No" << endl;
}