1. 연산자를 어떻게 끼워 넣어도 항상 -10억보다 크거나 같고, 10억보다 작거나 같다.
2. 중간에 계산되는 식의 결과도 항상 -10억보다 크거나 같고, 10억보다 작거나 같다.
3. int의 범위 : -21억 ~ 21억 (int 형 변수를 쓰면 됨)
N-1 개의 카드 중에서 중복 없이(같은 카드는 한 번 사용)
N-1 개를 순서있게 나열
중복
순서
시간 복잡도
공간 복잡도
YES
YES
\(O \left(N^M\right)\)
\(O \left(M\right)\)
NO
YES
\(O \left(\frac{N!}{(N-M)!}\right)\)
\(O \left(M\right)\)
YES
NO
\(O \left(N^M\right)\) 보다 작음
\(O \left(M\right)\)
NO
NO
\(O \left(\frac{N!}{M!(N-M)!}\right)\)
\(O \left(M\right)\)
publicclassbaekjoon14888{staticintN,MAX,MIN;staticint[]operatorNum=newint[5];staticint[]num;publicstaticvoidmain(String[]args)throwsIOException{BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));StringTokenizerst=newStringTokenizer(br.readLine()," ");N=Integer.parseInt(st.nextToken());MAX=Integer.MIN_VALUE;MIN=Integer.MAX_VALUE;num=newint[N+1];st=newStringTokenizer(br.readLine()," ");for(inti=1;i<=N;i++){num[i]=Integer.parseInt(st.nextToken());}st=newStringTokenizer(br.readLine()," ");for(inti=1;i<=4;i++){operatorNum[i]=Integer.parseInt(st.nextToken());}dfs(1,num[1]);System.out.println(MAX);System.out.println(MIN);}// order[1...N-1] 에 연산자들이 순서대로 저장될 것이다.publicstaticvoiddfs(intk,intvalue){if(N==k){// 완성된 식에 맞게 계산을 해서 정답에 갱신하는 작업MAX=Math.max(value,MAX);MIN=Math.min(value,MIN);}else{// k 번째 연산자는 무엇을 선택할 것인가?for(inti=1;i<=4;i++){if(operatorNum[i]>=1){operatorNum[i]--;dfs(k+1,calculation(value,i,num[k+1]));operatorNum[i]++;}}}}// 피연산자 2개와 연산자가 주어졌을 때 계산해주는 함수publicstaticintcalculation(intfirst,intoperator,intsecond){switch(operator){case1:returnfirst+second;case2:returnfirst-second;case3:returnfirst*second;default:returnfirst/second;}}}
1. N의 최댓값 14 일 때 21억을 넘는지 모름.
2. int로 정해 놓고 N을 14로 입력하고 확인하거나
3. 백 트래킹은 모든 방법을 일일이 확인하는 거기 때문에 정답이 21억을 넘는다는 것은 수행 연산 시간도 21억을 넘는다는 것이기 때문에
int 범위라는 것을 간접적으로 유추할 수 있음
1. 부분 수열 : 수열의 일부 항을 선택해서 원래 순서대로 나열
2. 진부분 수열 : 아무것도 안 고르는 경우는 뺀 부분 수열
3. 부분 수열의 개수 상한 : 2^20 <= 1,048,576 정답 변수는 int 형 변수 사용
4. 부분 수열의 합 상한 : 20*1,000,000 합을 기록하는 변수 int 형 변수 사용
부분 수열에 포함시키지 않느다.
부분 수열에 포함시킨다
\[2^{20} \simeq 100만\]
중복
순서
시간 복잡도
공간 복잡도
YES
YES
\(O \left(N^M\right)\)
\(O \left(M\right)\)
NO
YES
\(O \left(\frac{N!}{(N-M)!}\right)\)
\(O \left(M\right)\)
YES
NO
\(O \left(N^M\right)\) 보다 작음
\(O \left(M\right)\)
NO
NO
\(O \left(\frac{N!}{M!(N-M)!}\right)\)
\(O \left(M\right)\)
publicclassbaekjoon1182{staticintN,S,result=0;staticint[]arr;publicstaticvoidmain(String[]args)throwsIOException{BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));StringTokenizerst=newStringTokenizer(br.readLine()," ");N=Integer.parseInt(st.nextToken());S=Integer.parseInt(st.nextToken());arr=newint[N+1];st=newStringTokenizer(br.readLine()," ");for(inti=1;i<=N;i++){arr[i]=Integer.parseInt(st.nextToken());}dfs(1,0);if(S==0){result--;}System.out.println(result);}// k번째 원소를 포함시킬 지 정하는 함수// value:= k-1 번째 원소까지 골라진 원소들의 합publicstaticvoiddfs(intk,intvalue){if(k==N+1){// 부분 수열을 하나 완성 시킨 상태// value 가 S 랑 같은 지 확인하기if(S==value)result++;}else{// k 번째 원소를 포함시킬 지 결정하고 재귀호출해주기// Includedfs(k+1,value+arr[k]);// Not Includedfs(k+1,value);}}}