inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

5-L

[5-L] 시간복잡도 계산 코멘트 요청

548

개발자아닙니다

작성한 질문수 23

0

안녕하세요 큰돌 선생님!!

5-L 문제 접근할 때 비트마스킹을 못 떠올려서, 전체 인원 중에 절반 인원을 뽑는 조합으로 생각했습니다.

최대치로 가정하고 계산한다면, 20C10이 되는데요. 선생님은 비트마스킹을 써야 한다는 것을 조합과 어떻게 구분하셨는지 코멘트 주시면 감사하겠습니다..!

앞에 aass0930님 질문글을 읽어보아도 제가 생각했던 로직에 대한 답을 찾을 수 없어서 이렇게 추가적으로 질문 드렸습니다!

추가 질문) 경우의 수로 접근한다면, 스타트 팀에 인원을 먼저 배정한다고 했을 때 20 * 19 의 경우의 수가 나오는건가요?

 

항상 감사합니다 :)

c++ 코딩-테스트

답변 1

1

큰돌

안녕하세요 진살라님 ㅎㅎ

최대치로 가정하고 계산한다면, 20C10이 되는데요.

>> 네 맞습니다.

선생님은 비트마스킹을 써야 한다는 것을 조합과 어떻게 구분하셨는지 코멘트 주시면 감사하겠습니다..!

>> 뽑는데 순서가 상관이 없죠? ㅎㅎ 그래서 조합입니다. / 비트마스킹은 이러한 조합을 하나의 수로 나타낼 수 있는 트릭같은 거라고 생각하시면 되요. 비트마스킹으로 하셔도 되고 조합으로 하셔도 됩니다. 단지 저는 비트마스킹이 편리해서 비트마스킹으로 했습니다.

앞에 aass0930님 질문글을 읽어보아도 제가 생각했던 로직에 대한 답을 찾을 수 없어서 이렇게 추가적으로 질문 드렸습니다!

>>

조합으로 설정하고 하셨다는거 아닌가요?? 조합으로 하셔도 됩니다. 조금만 더 응용하면 되요.

한번 조합 COMBI 재귀를 이용해 풀어볼까요?

원래 조합 combi는 vector로 뽑는데 이거는 뽑아져있는거 외의 안 뽑아져있는 것도 배열에다가 집어넣어야 하기 때문에 visited 배열을 만들면 좀 더 쉽게 할 수 있어요.

#include <bits/stdc++.h>
using namespace std;
const int INF = 987654321;
int s[24][24], ret = INF, n; 
int k = 10, visited[24];
vector<int> v; 
int go(vector<int>& a, vector<int> & b){
	pair<int, int> ret;  
	for(int i = 0; i < n / 2; i++){
		for(int j = 0; j < n / 2; j++){
			if(i == j)continue;
			ret.first += s[a[i]][a[j]];
			ret.second += s[b[i]][b[j]]; 
		}
	}
	return abs(ret.first - ret.second);
} 
void combi(int start, vector<int> b){ 
    if(b.size() == k){ 
        vector<int> start, link; 
        for(int i = 0; i < n; i++){
        	if(visited[i])start.push_back(i);
        	else link.push_back(i);
		} 
		ret = min(ret, go(start, link)); 
        return;
    }
    for(int i = start + 1; i < n; i++){ 
        visited[i] = 1;
        b.push_back(i);
        combi(i, b);
        visited[i] = 0; 
        b.pop_back();
    }
    return;
}  

int main() { 
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> s[i][j];
        }
    } 
    k = n / 2;
	vector<int> v;  
    combi(-1, v);  
    cout << ret << '\n';
} 

이렇게 말이죠.

(visited 배열 안 만들면 vector<int> b를 기반으로 계속해서 find를 걸어서 i가 들어가 있나 안 들어가있는 확인해야 하는 로직이 +로 들거든요 find는 O(n)시간복잡도라 visited배열을 만들어서 시간복잡도를 O(1)로 한것도 눈여겨 봐주세요)

추가 질문) 경우의 수로 접근한다면, 스타트 팀에 인원을 먼저 배정한다고 했을 때 20 * 19 의 경우의 수가 나오는건가요?

>> 음.. 아니죠. 20C10 곱하기 20 곱하기 20이 됩니다. 10개 뽑고 뽑을 때마다 맵 전체 탐색이니까요 ㅎㅎ

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

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

감사합니다.

강사 큰돌 올림.

0

개발자아닙니다

답변 감사합니다!

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

0

9

2

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

0

23

1

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

0

11

1

진행 방법 질문드립니다!

0

41

2

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

0

55

2

2주차 개념#12 트리 순회

0

26

2

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

0

286

2

백준 서비스 종료

9

889

1

sk 하이닉스 코테 대비

0

367

2

3-G 최댓값 질문

0

50

1

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

0

83

2

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

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

102

2

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

0

66

2

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

0

169

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