해결된 질문
작성
·
389
0
안녕하세요 강사님, 강의 잘 듣고 있습니다.
조합을 구하는 함수의 시간복잡도에 대해 질문 드리고 싶습니다.
// Online C++ compiler to run C++ program online
#include <iostream>
#include <vector>
using namespace std;
int r=0;
vector<int> t;
int cnt=0;
int forcount=0;
void combi(int idx)
{
if(t.size()==r)
{
cnt++;
return;
}
for(int i=idx; i<=10; i++)
{
forcount++;
t.push_back(i);
func(i+1);
t.pop_back();
}
}
int main() {
// Write C++ code here
while(true){
cnt=0;
forcount=0;
cin>>r;
func(1);
cout<<"cnt = "<<cnt<<"\n";
cout<<"forcount = "<<forcount;
}
return 0;
}
조합 함수의 시간복잡도는 O(nCr), 위의 함수에서는 cnt의 값이라고 알고 있습니다.
그런데, 시간복잡도는 주어진 입력의 크기에 대한 연산의 총합이라고 알고 있습니다.
그러면, combi 함수의 for문 연산의 수인 forcount도 고려해야 하지 않나요?
왜? cnt만 고려해도 되는지 궁금합니다.
답변 2
0
안녕하세요 lego님 ㅎㅎ
조합 함수의 시간복잡도는 O(nCr), 위의 함수에서는 cnt의 값이라고 알고 있습니다.
>> 제가 혹시 해당 강의내에 어떤 부분에서 이렇게 말씀 드렸을까요?
감사합니다.
특정 조합의 개수, nCr이 1억 이하면, 제한시간이 1초인 문제에서도 조합을 일일이 구해 완전탐색을 적용해도 되는 건가요?
아니면 위의 코드처럼 forcount가 1억 이하인 경우에만 쓸 수 있는 건가요?
>> 완벽하게 그렇게 정해진 것은 없습니다. 다만 1억이하라면 조합을 일일히 구해 완탐을 적용해도될 것같다. 라고 들어가시는게 좋습니다. 그게 안되면 빠르게 다른 로직을 생각해야 하구요.
또한 아마 nC3, nC4, nC5.. 이런식으로 모든 조합의 수를 만들어야한다면 -> 코드가 복잡해지니 -> 다른 방법이 있지 않을까? 를 생각해야 합니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
lego0313님, 코딩테스트 강의를 듣고 계신다니 정말 반갑습니다!
조합 함수의 시간 복잡도에 대한 질문을 주셨군요.
시간 복잡도를 계산할 때는 해당 코드가 수행하는 연산의 횟수를 고려해야 합니다.
주어진 코드에서 combi
함수 내의 for문 또한 중요한 연산의 일부이므로 forcount
값도 시간 복잡도를 계산하는 데 포함되어야 합니다.
변수 cnt
는 조합의 개수를 세는 변수로, nCr의 결과값과 동일합니다. 하지만 시간 복잡도를 계산할 때는 코드가 실행되면서 발생하는 모든 연산을 고려해야 하며, 이는 cnt
가 아니라 for문을 몇 번 실행하는지, 즉 forcount
의 값에 해당합니다.
따라서 주어진 코드의 시간 복잡도는 재귀 함수 combi
가 몇 번 호출되었는지(cnt
), 그리고 내부 for문이 몇 번 실행되었는지(forcount
)를 전부 고려하여 O(nCr * 중첩된 반복문 실행 횟수)가 됩니다. 실제로는 nCr과 for문의 실행 횟수는 다를 수 있기 때문에 정확히 분석하려면 모든 연산을 따져봐야 합니다.
조합 함수를 작성하면서 복잡도를 계산하는 것은 알고리즘을 이해하고 최적화하는데 매우 중요하니, 계속 학습하며 실력을 키워가시길 바랍니다.
더 궁금한 점이 있으시면 언제든지 질문해 주세요. 화이팅! 🌟
강의 내에서 직접 언급하신 건 없었던 것으로 기억합니다.
대신 조합을 이용해서 문제를 푸는 경우가 있었습니다.
특정 조합의 개수, nCr이 1억 이하면, 제한시간이 1초인 문제에서도 조합을 일일이 구해 완전탐색을 적용해도 되는 건가요?
아니면 위의 코드처럼 forcount가 1억 이하인 경우에만 쓸 수 있는 건가요?
감사합니다.