728x90
본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
https://github.com/ROUTINE-STUDY/Algorithm
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.
문의는 댓글 바람.
문제 출처 :https://www.acmicpc.net/problem/14225
[문제 설명]
수열의 조합으로 나올 수 없는 가장 작은 수를 구하시오.
[접근 방법]
문제 그대로 수열을 조합할 수 있는 모든 경우를 구하고, 그 중에서 만들 수 없는 가장 작은 수를 리턴하면 된다.
나 같은 경우에는 조합의 모든 경우를 구하고, boolean 배열에 존재하는 숫자면 true로 처리해줬다.
수열의 크기는 최대 20, 수의 값의 최대는 100,000이므로, 수열의 합의 최대값은 20*100,000 = 2,000,000
따라서 200만짜리 boolean 배열을 만들어줘야 한다. 언뜻 보기엔 커보인다.
그러나 boolean은 1개의 2byte라 총합해서 4mb정도 될 듯하다.
시간복잡도는 모든 숫자가 있나 없나이므로 O(2^(수열의 크기)) => O(2^N) => 2^20
공간복잡도는 O(S) => 10,0000
[Java]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static boolean[] isExistNumber = new boolean[2000001];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int sizeOfNumbers = Integer.parseInt(br.readLine());
int[] arrOfNumbers = new int[sizeOfNumbers];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < sizeOfNumbers; i++) {
arrOfNumbers[i] = Integer.parseInt(st.nextToken());
}
int answer = 0;
checkPossibleNum(arrOfNumbers, 0, 0);
for (int i = 1; i < isExistNumber.length; i++) {
if (!isExistNumber[i]) {
answer = i;
break;
}
}
System.out.println(answer);
}
// 만들 수 있는 숫자는 방문처리
private static void checkPossibleNum(int[] arrOfNumbers, int index, int sum) {
if (index == arrOfNumbers.length) {
return;
}
// 현재 숫자를 더했을 경우,
isExistNumber[sum+arrOfNumbers[index]] = true;
checkPossibleNum(arrOfNumbers, index+1, sum+arrOfNumbers[index]);
// 현재 숫자를 더하지 않았을 경우
isExistNumber[sum] = true;
checkPossibleNum(arrOfNumbers, index+1, sum);
}
}
728x90
반응형
'알고리즘 문제 풀이 > 완전탐색' 카테고리의 다른 글
백준 - 보물섬 (0) | 2022.01.26 |
---|---|
백준 - 연산자 끼워넣기(Java) (0) | 2022.01.25 |
백준 - 대표 자연수 (0) | 2022.01.25 |
백준 - 연구소 (0) | 2022.01.23 |
백준 - 일곱 난쟁이(Java) 다시 풀기 (0) | 2022.01.22 |