728x90
반응형
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeUtVakTMDFAVH
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
최종 코드
GitHub - hwayeon351/SWEA-Algorithms: SWEA 알고리즘 소스 코드 모음
SWEA 알고리즘 소스 코드 모음. Contribute to hwayeon351/SWEA-Algorithms development by creating an account on GitHub.
github.com
//
// main.cpp
// SWEA4012
//
// Created by Hwayeon on 2021/10/15.
//
#include <iostream>
#include <string.h>
using namespace std;
int N;
int synergy[17][17] = {0, };
int visit[17] = {0, };
int answer = 20001;
void make_food(int cnt, int i){
if(cnt == N/2){
int A = 0;
int B = 0;
for(int j=1; j<=N; j++){
for(int k=1; k<=N; k++){
if(j == k) continue;
if(visit[j] && visit[k]){
A += synergy[j][k];
}
else if(!visit[j] && !visit[k]){
B += synergy[j][k];
}
}
}
int result = abs(A-B);
if(result < answer) answer = result;
return;
}
if(i > N) return;
for(int j=i; j<=N; j++){
visit[j] = 1;
make_food(cnt+1, j+1);
visit[j] = 0;
}
}
int main(int argc, const char * argv[]) {
int test_case;
int T;
cin >> T;
for(test_case = 1; test_case<=T; ++test_case){
answer = 20001;
cin >> N;
for(int y=1; y<=N; y++){
for(int x=1; x<=N; x++){
cin >> synergy[y][x];
}
}
make_food(0, 1);
cout << "#" << test_case << " " << answer << endl;
}
return 0;
}
풀이 과정
풀이 시간 23분
#include <iostream>
#include <string.h>
using namespace std;
int N;
int synergy[17][17] = {0, };
int visit[17] = {0, };
int answer = 20001;
void make_food(int cnt, int i){
//재료 N/2개 뽑은 경우,
if(cnt == N/2){
//A = 음식 A의 맛, B = 음식 B의 맛
int A = 0;
int B = 0;
for(int j=1; j<=N; j++){
for(int k=1; k<=N; k++){
//재료가 같은 경우의 조합은 없다
if(j == k) continue;
//A의 두 재료 j, k 시너지 더하기
if(visit[j] && visit[k]){
A += synergy[j][k];
}
//B의 두 재료 j, k 시너지 더하기
else if(!visit[j] && !visit[k]){
B += synergy[j][k];
}
}
}
//음식 A와 B의 맛 차이
int result = abs(A-B);
if(result < answer) answer = result;
return;
}
if(i > N) return;
//재료 뽑기 -> 조합
for(int j=i; j<=N; j++){
visit[j] = 1;
make_food(cnt+1, j+1);
visit[j] = 0;
}
}
int main(int argc, const char * argv[]) {
int test_case;
int T;
cin >> T;
for(test_case = 1; test_case<=T; ++test_case){
//answer 시너지의 최댓값은 20,000이므로 20,001로 초기화한다
answer = 20001;
cin >> N;
for(int y=1; y<=N; y++){
for(int x=1; x<=N; x++){
cin >> synergy[y][x];
}
}
make_food(0, 1);
cout << "#" << test_case << " " << answer << endl;
}
return 0;
}
//시간복잡도 = T(T*2^N)-> O(N^2), 공간복잡도 = O(N^2)
728x90
반응형
'코테 노트 > SWEA' 카테고리의 다른 글
SWEA2382 [모의 SW 역량테스트] 미생물 격리 C++ (0) | 2021.10.16 |
---|---|
SWEA 4013 [모의 SW 역량테스트] 특이한 자석 C++ (0) | 2021.10.15 |
SWEA 5658 [모의 SW 역량테스트] 보물상자 비밀번호 C++ (0) | 2021.02.03 |
SWEA 5653 [모의 SW 역량테스트] 줄기세포배양 C++ (0) | 2021.01.30 |
SWEA 1953 [모의 SW 역량테스트] 탈주범 검거 (0) | 2021.01.15 |