요즘은 회사도 바쁘고, 사이드도 진행하느라, 바쁘지만,
그동안 잊고 안 했던 코딩 테스트를 다시 해보려고 한다.
오랜만에 해보니 역시 살짝 감을 잃은 느낌이다.
[백준] 2798번 : 블랙잭 - JAVA [자바]
www.acmicpc.net/problem/2798 2798번: 블랙잭 문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블
st-lab.tistory.com
스트렌져님의 블로그를 참고하였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Test2798 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine(), " ");
// 배열에 숫자들을 넣어준다.
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
//M에 가까운 숫자 조합 가져오기
int result = getLargeNumCombinations(arr, N, M);
System.out.print(result);
}
private static int getLargeNumCombinations(int[] arr, int N, int M) {
// 결과
int result = 0;
for(int i = 0; i < N - 2; i++) {
if(arr[i] > M) continue;
for(int j = i + 1; j < N - 1; j++) {
if(arr[i] + arr[j] > M) continue;
for(int k = j + 1; k < N; k++) {
int sum = arr[i] + arr[j] + arr[k];
if(sum == M) {
result = sum;
return result;
}
if(result < sum && sum < M) {
result = sum;
}
}
}
}
return result;
}
}
브루트 포스라는 카테고리의 문제 중 하나이다.
브루트 포스란 '난폭한' 이란 뜻으로 어떠한 값을 찾아내기 위해
이것저것 대입해보는 방법을 말한다고 한다.
처음에는 효율적?으로 문제를 푸는데 집중을 하였다.
아래는 처음 풀었던 코드이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static Integer[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
arr = new Integer[N];
st = new StringTokenizer(br.readLine(), " ");
// 배열에 숫자들을 넣어준다.
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
//큰 숫자 순으로 정렬
Arrays.sort(arr, Collections.reverseOrder());
//M에 가까운 숫자 조합 가져오기
int result = getLargeNumCombinations(M);
System.out.print(result);
}
private static int getLargeNumCombinations(int max) {
// 결과
int result = 0;
//제일 큰 두 값
int most1;
int most2;
for(int j = 0; j < arr.length - 1; j++) {
// 처음엔 제일 큰 두값이 0, 1 인덱스 지만,
// 만약 큰 값을 발견하지 못하고 한 싸이클을 다시 돌게되면
// 1씩 더해준다.
most1 = arr[j];
most2 = arr[j + 1];
for(int i = j + 2; i < arr.length; i++) {
// 셋이 합친값
int sum = most1 + most2 + arr[i];
//같거나 작으면 result return
if(sum <= max) {
result = sum;
return result;
}
}
}
return result;
}
}
이 코드의 문제점은
5, 3, 2, 1
아래의 반례로 인해 문제점이 들어났다.
나 같은 경우는 N값들을 받아 오름차순으로 정렬하고,
제일 큰 값 두 개를 먼저 더한 후 다 대입해보고
원하는 값이 나오지 않으면,
안되면 두 번째와 세 번째로 큰 값을 대입해보며
결국 마지막에 종료하는 코드였다.
하지만 돌이켜 보면, 모든 경우의 수는 나오지 않는 형식이었다.
무조건 큰 수를 더해서 차례로 뺀다 한들,
여러 조합들의 경우의 수를 다 구하진 못하는 것이었다.
브루트 포스, 말 그대로 모든 경우의 수를 대입해보는 방법으로 찾는 것이
정답이었다.
CodingTest #23 Java 1427 (소트인사이드) 문제 풀이 (0) | 2022.09.08 |
---|---|
CodingTest #22 Java 25305 (커트라인) 문제풀이 (0) | 2022.09.05 |
CodingTest # 22 Java 2231 (분해합) 문제 풀이 (0) | 2022.08.10 |
CodingTest # 21 Java 3003 (킹, 퀸, 룩, 비숍, 나이트, 폰), 25304 (영수증) 문제 풀이 (0) | 2022.08.09 |
CodingTest # 20 Java 1978 (소수 찾기), 2581 (소수) 문제 풀이 (0) | 2022.05.27 |
CodingTest # 19 Java 10250(ACM 호텔), 2775 (부녀회장이 될테야) 문제 풀이 (0) | 2022.05.24 |
CodingTest # 18 Java 1193 (분수 찾기) 문제 풀이 (0) | 2022.05.07 |
CodingTest # 17 Java 1316(그룹 단어 체커), 1712(손익분기점), 2292(벌집), 25083(새싹) 문제풀이 (0) | 2022.05.06 |
내 블로그 - 관리자 홈 전환 |
Q
Q
|
---|---|
새 글 쓰기 |
W
W
|
글 수정 (권한 있는 경우) |
E
E
|
---|---|
댓글 영역으로 이동 |
C
C
|
이 페이지의 URL 복사 |
S
S
|
---|---|
맨 위로 이동 |
T
T
|
티스토리 홈 이동 |
H
H
|
단축키 안내 |
Shift + /
⇧ + /
|
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.