250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Bfs와DFS
- 알고리즘개념
- 전화번호속의암호
- 완전탐색
- 백준2251
- 코테
- 순열
- 정올 1620
- 완탐
- 볼륨 만들기
- D드라이브생성
- 에라토스테네스의채
- 코테준비
- 주사위굴리기2
- 삼성역테
- 알고리즘
- 정보처리기사
- 재귀함수
- 백준
- 중복순열
- BFS
- 자바
- java
- 중복조합
- 자바 코테
- 23288
- 백준15652
- N과M
- 파티션 크기 조정
- 백준13458
Archives
- Today
- Total
뚱땅뚱땅
[문제] 백준 2798번 블랙잭 본문
728x90
* 출처: 백준 단계별로 풀어보기 브루트 포스 편
2798번: 블랙잭
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장
www.acmicpc.net
내 생각
1. 첫번째 풀이
1시간 정도 고민하다가 더이상 생각을 못하겠어서 못 풀었다.
ArrayList를 써보고 싶어서, 블랙잭 카드를 list에 담고, 애초에 정렬했다.
그 후에 스택에다가 list의 인덱스를 push해서 완전 탐색하는 방법을 고민하다가 머리 빠개질 거 같아서 그만 뒀다...
그냥 3중 for 문 돌리면 끝이었다.
아래는 다른 분 코드 참고한 것
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine(), " ");
int N = Integer.parseInt(st.nextToken()); // 카드 수
int M = Integer.parseInt(st.nextToken()); // 최대값
int[] arr = new int[N];
st = new StringTokenizer(in.readLine(), " ");
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int result = search(arr,N,M);
System.out.println(result);
}
static int search(int[] arr, int N, int M) {
int result = 0;
for(int i=0;i<N-2;i++) {
// 첫번째 카드가 M보다 크면 건너뛰기
if(arr[i]>M) continue;
for(int j=i+1;j<N-1;j++) {
// 첫번째 + 두번째 카드 합이 M보다 크면 건너뛰기
if(arr[i]+ arr[j]> M) continue;
for(int k=j+1;k<N;k++) {
// 세 카드의 합 구해보기
int tmp = arr[i] + arr[j]+ arr[k];
//최대값이랑 똑같다면 바로 리턴
if(tmp == M) return tmp;
// M 보다는 작지만 그전의 합보다 크면 result 갱신
if(result<tmp && tmp<M) {
result = tmp;
}
}
}
}
return result;
}
}
2. 두번째 풀이
이 문제는 조합 문제이다! 재귀적으로 다시 풀어봤다.
public class Main {
static int N; //카드 수
static int M; // 최대값
static int[] arr;
static int[] numbers; // 조합
static int sum = 0;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine(), " ");
N = Integer.parseInt(st.nextToken()); // 카드 수
M = Integer.parseInt(st.nextToken()); // 최대값
arr = new int[N];
numbers = new int[3];
st = new StringTokenizer(in.readLine(), " ");
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
search(0,0);
System.out.println(sum);
}
static void search(int cnt, int start) {
if(cnt == 3){
int tmp = 0;
for(int i=0;i<3;i++) {
tmp += numbers[i];
}
if(tmp<=M)
sum = Math.max(tmp, sum);
return;
}
for(int i=start;i<N;i++) {
numbers[cnt] = arr[i];
search(cnt+1, i+1);
}
}
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[문제] 백준 15664번 N과 M(10) (0) | 2021.02.04 |
---|---|
[문제] 백준 2231번 분해합 (0) | 2021.02.03 |
[문제] 백준 1244번 스위치 켜고 끄기 (0) | 2021.02.01 |
[문제] 백준 17478번 재귀함수가 뭔가요? (0) | 2021.02.01 |
[문제]백준 9020번 골드바흐의 추측 (0) | 2021.01.30 |
Comments