# 문제링크
2309번: 일곱 난쟁이
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
www.acmicpc.net
아홉 난쟁이 중에 일곱 난쟁이의 키를 합해서 100이 되어야 하는 문제. 이중 for문으로 9 개 중에 2개를 골라도 되고, DFS를 사용해도 된다.
# 제출 코드
// 이중 for 문 사용 코드
#include <iostream>
#include <algorithm>
# define INF 0x7f
using namespace std;
int ki[10];
int sum;
void Input() {
for (int i = 0; i < 9; i++) {
cin >> ki[i];
sum += ki[i];
}
}
void Solve() {
for (int i = 0; i < 8; i++) {
for (int j = i + 1; j < 9; j++) {
if (sum - ki[i] - ki[j] == 100) {
ki[i] = INF;
ki[j] = INF;
return;
}
}
}
}
void Output() {
sort(ki, ki + 9);
for (int i = 0; i < 7; i++)
cout << ki[i] << endl;
}
int main() {
Input();
Solve();
Output();
}
// DFS 사용 코드
#include <iostream>
#include <algorithm>
using namespace std;
int ki[10];
bool visited[10];
int sum;
void Input() {
for (int i = 0; i < 9; i++) {
cin >> ki[i];
sum += ki[i];
}
sort(ki, ki + 9);
}
int DFS(int node, int temp) {
if (node == 2) {
if (sum - temp == 100) return 1;
return 0;
}
for (int i = 0; i < 9; i++) {
if (visited[i] == true) continue;
visited[i] = true;
if (DFS(node + 1, temp + ki[i]) == 1) return 1;
visited[i] = false;
}
return 0;
}
void Output() {
for (int i = 0; i < 9; i++)
if(visited[i] != 1) cout << ki[i] << endl;
}
int main() {
Input();
DFS(0, 0);
Output();
}
반응형
'Computer Science&Engineering > 코딩테스트' 카테고리의 다른 글
[정올 1516] 단어 세기 (0) | 2021.03.24 |
---|---|
[백준 2659] 십자카드 문제 C++ 풀이 (0) | 2021.03.24 |
[백준 11004] K번째 수 (0) | 2021.03.20 |
[백준 10825] 국영수 정렬문제 (0) | 2021.03.20 |
[백준 10814] 나이순 정렬 (0) | 2021.03.20 |