백준 java 2798번 블랙잭
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 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.
합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.
출력:
첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.
코드:
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); //카드의 개수
int m = in.nextInt(); //조건
int [] card=new int[n];
int result=0;
for (int i=0;i<n;i++){
card[i] = in.nextInt(); //각 카드의 값 입력받기
}
for(int i=0;i<n;i++) {
for(int j=i+1;j<n;j++) {
for(int h=j+1;h<n;h++) {
int sum=card[i]+card[j]+card[h]; //카드 세장의 합
if(sum==m) {
result=sum;
break;
}
if(result<sum&&sum<m) result=sum;
}
}
} //end of 2중 for
System.out.println(result);
}
}
먼저 삼중 for문을 통해 가능한 모든 카드의 합을 구했다.
마지막 for문 내부에서 if문으로 m에 최대한 가까운 카드의 합을 구할 것이다.
위의 코드에서 노란색으로 줄쳐진 부분이다.
m과 완전히 같은 값이라면, 더이상 for문을 진행하지 않아도 된다.
바로 그 값을 result에 넣어주고, for문을 종료시킨다.
m과 완전히 같은 값이 아니라면, 다른 if문으로 넘어간다.
result 값을 갱신시켜주는 부분이다.
result 값에 계속해서 바뀔수 있는데, 그러려면 카드의 합이 m보다 작고 이전에 저장되어 있던 값보다 커야 한다.
이 조건을 충족하지 않으면, result 값은 갱신되지 않는다.
이렇게 계속해서 result 값을 갱신시켜 나가다 보면,
결국 result 에는 m보다는 작지만 가능한 값 중 가장 큰 값이 저장되어 있게 된다.
마지막으로 for문을 모두 종료한 후, result 값을 출력해주면 된다.