2309번: 일곱 난쟁이
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
www.acmicpc.net
문제풀이
- dfs를 통해 9명 중 7명을 뽑는 Combination(조합)을 해주는 문제
- 조합 코드 : 다시 for문으로 갈때 i=x부터 시작하는것이 중요! visit 중요 !
- sum==100 이면 바로 탈출 dfs 진입 처음 if문에 flag 이용 !
for(int i = x ; i<9 ; i++)
{
if(flag == true)
break;
if(vi[i]==false)
{
vi[i]=true;
//sum = sum + Nan[i];
dfs(x+1,num+1,sum+Nan[i]);
//sum = sum -Nan[i];
vi[i]=false;
}
}
C++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool visit[9] = { false, };
int arrNuan[9] = { 0, };
bool flag = false;
vector<int> v;
void input()
{
for (int i = 0; i < 9; i++)
{
int temp;
cin >> temp;
arrNuan[i] = temp;
}
}
void dfs(int p,int cnt, int sum)
{
if (cnt == 7)
{
if (sum == 100)
{
flag = true;
sort(v.begin(), v.end());
for (auto i : v)
{
cout << i << endl;
}
}
return;
}
for (int w = p; w < 9; w++)
{
if (!visit[w])
{
visit[w] = true;
v.push_back(arrNuan[w]);
dfs(w, cnt+1, sum + arrNuan[w]);
if (flag) break;
v.pop_back();
visit[w] = false;
}
}
}
int main()
{
visit[9] = { false, };
arrNuan[9] = { 0, };
flag = false;
for (int i = 0; i < v.size(); i++)
v.pop_back();
input();
dfs(0,0,0);
return 0;
}
Java
package Z_ShinHanCard_Prepare;
import java.util.*;
public class D2백준2309_일곱난쟁이_DFS {
//9C7 뽑는 경우의 수 !!
static int[] Nan = new int[9];;
static boolean[] vi = new boolean[9];;
static ArrayList<Integer> arr =new ArrayList<Integer>();
static boolean flag;
static void dfs(int x, int num,int sum)
{
if(num==7)
{
if(sum==100)
{
//arr = new ArrayList<Integer>();
for(int i =0 ; i < 9 ; i++ )
{
if (vi[i]==true)
{
arr.add(i);
}
flag=true;
}
}
return;
}
for(int i = x ; i<9 ; i++)
{
if(flag == true)
break;
if(vi[i]==false)
{
vi[i]=true;
//sum = sum + Nan[i];
dfs(x+1,num+1,sum+Nan[i]);
//sum = sum -Nan[i];
vi[i]=false;
}
}
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
for(int i =0 ; i < 9 ; i ++)
{
int temp = sc.nextInt();
Nan[i] = temp;
}
dfs(0,0,0);
ArrayList<Integer> answer = new ArrayList<Integer>();
for(int x : arr)
{
answer.add(Nan[x]);
}
Collections.sort(answer);
for(int x : answer)
{
System.out.println(x);
}
}
}
'Algorithm' 카테고리의 다른 글
[백준 7562] 나이트의 이동 (C++, Java) (0) | 2020.09.07 |
---|---|
[백준 2664] 촌수계산 (C++, Java) (0) | 2020.09.06 |
[백준 2178] 미로찾기 (C++, Java) (0) | 2020.09.06 |
[백준_1260] DFSBFS (0) | 2020.09.06 |
[백준 12871] 무한문자열 (C++, Java) (0) | 2020.09.03 |