2309문제 일곱 난쟁이(브루트포스) Java(DFS)
2021. 9. 18. 14:40ㆍ알고리즘/백준
반응형
문제
왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.
아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.
아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.
입력
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
출력
일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다.
출처: <https://www.acmicpc.net/problem/2309>
##문제이해##
9개의 값을 입력받아서 9개 중 7개의 수를 조합해서 합이(sum) 100이 되는경우를 찾고 정렬해서 출력하는 문제!
DFS를 사용해서 모든 경우의 수를 찾고 해당하는 결 int배열로 담아서 Arrays.sort()로 정렬 후 가공하여 출력하였다.
방문여부를 체크하는 boolean배열 visit을 이용하여 관리함!
##코드##
import java.util.Arrays;
import java.util.Scanner;
public class boj_2309 {
static int N = 9; //9개의 변수를 받는다.
static int M = 7; //7명을 찾아야함.
static int arr[];
static int result[];
static boolean[] visit;
static int printresult[];
public static void main(String[] args) {
//총 9개의 숫자를 받는데 그 숫자들로 숫자 100을 완성시키는 경우의 수를 찾아야한다.
Scanner sc = new Scanner(System.in);
arr= new int[N];
result= new int[M];
printresult= new int[M];
visit = new boolean[N];//방문여부 체크용
for(int i=0; i<N; i++) {
arr[i]=sc.nextInt();
}
dfs(0);
//정렬
Arrays.sort(printresult);
StringBuffer sb = new StringBuffer();
for(int num : printresult) {
sb.append(String.valueOf(num)+"\n");
}
System.out.println(sb);
}
public static void dfs(int depth) {
//종료조건 7명의 키를 다 담았을경우 종료
if(depth==M) {
int sum =0;
for(int height:result) {
sum+=height;
}
//7명의 키의 합이 100이면
if(sum==100) {
//print할 배열에 저장
for(int i=0; i<result.length;i++) {
printresult[i]=result[i];
}
}
return;
}
//수행
for(int i=0; i<N; i++) {
//방문여부체크
if(visit[i]==false) {
visit[i]=true;
result[depth] = arr[i];
dfs(depth+1);
visit[i]=false;
}
}
}
}
반응형
'알고리즘 > 백준' 카테고리의 다른 글
2667문제 단지번호붙이기(DFS/BFS) Java (0) | 2021.09.23 |
---|---|
2606문제 바이러스(DFS/BFS) Java (0) | 2021.09.23 |
9012문제 괄호(스택) Java (0) | 2021.09.18 |
18870 좌표압축(정렬) Java (0) | 2021.09.17 |
10814문제 나이순 정렬(정렬) Java (0) | 2021.09.17 |