유형: 배열, 완전탐색
1. n개의 카드 중 3개의 카드를 고르는 경우의 수 C(n,3)이며, n의 max는 100임
전체 경우의 수 C(n, 3) = n(n-1)(n-2) / 3!
2. 3중 반복문으로 모든 경우의 수를 확인하여 문제 해결가능
n개에서 3개를 고르는 경우의 수? => 3중 for문
가장 앞 하나의 인덱스 고정 후
해당 인덱스 다음 인덱스 중 추가로 값 고정
다시 다음인덱스 중에서 세 번째 인덱스 고정
package prep.test.coding;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Baekjoon2798 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st1 = new StringTokenizer(br.readLine());
int result = 0;
int[] lenArr = new int[Integer.parseInt(st1.nextToken())];
int targetNum = Integer.parseInt(st1.nextToken());
//System.out.println(lenArr);
//System.out.println(targetNum);
StringTokenizer st2 = new StringTokenizer(br.readLine());
for(int i=0; i<lenArr.length; i++) {
lenArr[i] = Integer.parseInt(st2.nextToken());
}
// n개에서 3개를 고르는 경우의 수? => 3중 for문
// 가장 앞 하나의 인덱스 고정 후
// 해당 인덱스 다음 인덱스 중 추가로 값 고정
// 다시 다음인덱스 중에서 세 번째 인덱스 고정
for(int i=0; i< lenArr.length; i++) {
for(int j=i+1; j<lenArr.length; j++) {
for(int k=j+1; k<lenArr.length; k++) {
// 각 인덱스의 합을 sum에 담기
int sum = lenArr[i]+lenArr[j]+lenArr[k];
// sum이 targetNum보다 작을 경우에만 조건비교
if(sum <=targetNum ) {
// sum이 targetNum보다 작고
// result에 담긴 값보다 크면
// result에 sum을 담기
result = Math.max(result, sum);
}
}
}
}
// 탐색이 완료된 후 result값 출력
bw.write(result+"");
bw.flush();
bw.close();
br.close();
}
}
소회:
bufferedReader, bufferedWriter 을 수업 때 배운 후 처음 사용해보았다
scanner, System.out.println보다는 확실히 복잡하고 구현시 외워야하는 부분도 있고
예외처리, 닫아주기 등 까다로운 부분이 있음
n개중 3개 고르기를 코드로 어떻게 구현할지 고민으로는 도저히 알 수 없었는데
nC3을 3중 for문으로 구현하는 부분이 재미있었다
'Algorithm (Java)' 카테고리의 다른 글
[자바/java]백준 2920 음계 (0) | 2023.02.20 |
---|