지구정복

[브루트포스] 백준 - 블랙잭 본문

데이터 엔지니어링 정복/Algorithm

[브루트포스] 백준 - 블랙잭

nooh._.jl 2021. 7. 23. 15:31
728x90
반응형

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

 

-문제해설

입력값인 카드의 개수 n과 주어진 카드 3장을 더해서 최대한 가깝게 만들어야 되는 수 m이 주어지면

출력값으로는 가장 m과 가까운 수를 출력하는 문제이다.

 

나는 단순하게 주어진 카드를 모두 비교하는 방법으로 문제를 해결했다.

 

먼저 한 번 반복시 담을 sum 변수와 최종적인 답이 담길 ans 변수를 선언하고

i, j, k 변수를 이용해서 삼중 포문을 돌린다.

 

sum에는 3장의 카드값이 더해진다.

sum = arr[i] + arr[j] + arr[k] 

 

이때 i, j, k값은 중복되면 안되므로

i==j일 때 continue

k==i or k==j일 때 continue를 해서 중복되지 않도록 한다.

 

그리고 sum값이 입력값 m보다 클 때는( sum > m ) continue로 다음 순회로 넘어가고

sum과 m이 같을 때 ( sum == m ) 는 곧바로 삼중포문을 빠져나온다.

이외의 경우에는 m-sum 과 m-ans 값을 비교해서 m-sum이 더 작을 경우 ans를 sum으로 초기화한다.

( m-sum <= m-ans )

 

 

-자바

package bruteforce;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class BJ2798 {
	private static BufferedWriter bw = 
			new BufferedWriter( new OutputStreamWriter(System.out));
	private static int n, m, sum, ans;
	private static int[] arr;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer( br.readLine() );
		n = Integer.parseInt( st.nextToken() );
		m = Integer.parseInt( st.nextToken() );
		
		arr = new int[n];

		st = new StringTokenizer( br.readLine() );
		for( int i=0; i<n; i++ ) arr[i] = Integer.parseInt( st.nextToken() );
		
		l:for( int i=0; i<n; i++ ) {
			for( int j=1; j<n; j++ ) {
				if( j==i ) continue;
				
				for( int k=2; k<n; k++ ) {
					if( k==i || k==j ) continue;
					
					sum = arr[i] + arr[j] + arr[k];
					
					if( sum > m ) continue;
					else if( sum == m ) {
						ans = sum; 
						break l;
					} else if( m-sum <= m-ans ) ans = sum;
					
				}
			}
		}
		bw.write( ans + "\n" );
		bw.flush();
		bw.close();
		br.close();
	}
}

 

-파이썬

n, m = map(int, input().split())
arr = list( map(int, input().split()) )

sum = 0; ans = 0; isBreak = False

for i in range( n ):
    for j in range( 1, n ):
        if i==j: continue
        
        for k in range( 2, n ):
            if k==i or k==j: continue
            
            sum = arr[i]+arr[j]+arr[k]
            
            if sum > m: continue
            elif sum == m:
                ans = sum; isBreak = True; break
            elif m-sum <= m-ans: ans = sum
        
        if isBreak: break
    if isBreak: break
print( ans )
728x90
반응형
Comments