inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

1주차 개념 #7. 문제로 연습하는 시간복잡도 Q5

1주차 개념#7에서 재귀함수의 시간복잡도를 구할 때 메인 로직은 어떤 기준으로 결정하는건가요?

399

박수민

작성한 질문수 2

0

안녕하세요.

재귀함수의 시간복잡도를 구할 때 (메인로직)*(함수호출횟수)라고 알려주셨는데, 여기에서 메인 로직은 어떤 기준으로 결정되는건가요?

감사합니다!

c++ 코딩-테스트

답변 2

3

큰돌

안녕하세요 수민님 ㅎㅎ

메인로직은 해당 함수에서 시간복잡도가 어느정도 큰 주요 로직이라고 보시면 됩니다.

다음 코드를 볼까요?

#include<bits/stdc++.h>
using namespace std;  
int N, cnt;
void solve(int N){
	cnt++;
	cout << cnt << '\n';
	if(N == 0) return;
	for(int i = 0; i < 3; i++){
		solve(N - 1);
	} 
	return;
}
int main(){
	cin >> N; 
	solve(N);    
	return 0;
} 

이 solve라는 함수에서 주요한 로직은

	for(int i = 0; i < 3; i++){
		solve(N - 1);
	} 

이부분입니다.

정확히는... 두가지의 로직이 합쳐져 있죠?

  • 로직1 : 주어진 N에 대해 solve(N - 1)을 3번 재귀 호출

  • 로직2 : 각 호출마다 cnt를 증가시키고 출력합니다.

여기서 메인로직이란 반복적으로(재귀적으로) 호출하는 부분이 시간복잡도가 크기 때문에 로직1이 됩니다.

 

다만 재귀함수에서 시간복잡도를 산정할 때는 여러가지 로직 중에서 재귀적으로 호출되는 함수부분과

다른 부분을 분리시켜서 봐야 하고

재귀적으로 호출되지 않는 부분중에 가장 시간복잡도가 큰 부분이 중요한 메인로직이 됩니다.

그리고 재귀함수의 시간복잡도는 해당 메인 로직 * 반복횟수로 결정됩니다.

void solve(int N){
	cnt++;
	cout << cnt << '\n';
	if(N == 0) return;
	for(int i = 0; i < 3; i++){
		solve(N - 1);
	} 
	return;
}

이코드에서 반복되는 for문을 제외하고 가장 큰 부분은 cout 부분 출력 = O(1)이기 때문에(로직2가 메인로직이 된다.)

	cout << cnt << '\n';

총 시간복잡도는 O(1) * 반복되는 횟수 = 3^n이 되어 3^n이 됩니다.

 

자 그러면... 이코드의 시간복잡도는 얼마일까요?

void solve(int N){
    cnt++;
    for(int i = 0; i < N; i++){
        cout << cnt << '\n';
    } 
    if(N == 0) return;
    for(int i = 0; i < 3; i++){
        solve(N - 1);
    } 
    return;
}

O(N) * 3^n이 되겠죠? 반복적으로 호출되는 부분 제외 -> 가장 큰부분 = for문 x 반복횟수가 되기 때문입니다.

 

 

 

 



또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


1

큰돌

수민님~ 제가 답변을 수정해서 다시 달았습니다.

기존답변은 설명이 좀 부족했던 것 같습니다.

 

참고부탁드립니다. 😃

교안 158페이지 문의드립니다

0

14

2

코딩살구클럽 관련 건의사항

0

32

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

16

1

진행 방법 질문드립니다!

0

51

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

56

2

2주차 개념#12 트리 순회

0

26

2

백준사이트가 종료된다고 합니다.

0

287

2

백준 서비스 종료

9

890

1

sk 하이닉스 코테 대비

0

368

2

3-G 최댓값 질문

0

51

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

83

2

3-I 코드 질문드립니다.

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

102

2

4-H 질문 있습니다 (코드 리뷰)

0

66

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

170

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

69

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

64

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

51

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

68

2

함수별 시간복잡도

0

73

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

53

2

1-I 문제 질문 드립니다.

0

76

2