문제 링크
주의사항
- JAVA를 사용하여 프로그램을 사용하였습니다.
- 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{
public static void main(String[] args){
}
}
문제 설명
접근 방법
브루트 포스란.
모든 경우의 수를 대입시켜서 가장 알맞은 경우의 수를 결과로 출력하는 것입니다.
그래서 이 문제를 정말 간단하게 생각하여 for문을 반복하면 되는 문제로 생각해보았는데 for문을 계속 반복하면 코드가 효율적으로 진행될 것 같다고 생각하지 않았습니다.
조금 고민을 하다가 떠오른 생각은 난쟁이의 키를 더해서 100을 맞추지 말고 빼서 맞춰주면 for문을 2번 쓰면 표현할 수 있겠다고 생각이 떠올라서 그 방식으로 문제를 해결하였습니다.
문제에 해결알고리즘은
1. 입력된 난쟁이의 키를 모두 더합니다.
2. 2중 for문을 통해서 2명을 제거할 수 있는 경우의 수를 구하였습니다.
3. 경우의 수마다 모두 더한 값에 2명의 키를 빼주었을 때 값이 100이 되는지 확인하였습니다.
4. 100이 되었을 때에는 빼준 2명의 난쟁이의 키를 -1로 설정하고 반복을 종료하였습니다.
5. 난쟁이의 키가 저장된 배열을 오름차순으로 정렬하였습니다.
6. 빼준 2명의 난쟁이의 키가 -1로 배열[0], 배열[1]의 값이 될 것으로 2~8의 배열의 값을 오름차순으로 출력하였습니다.
- BufferedReader를 사용하여 입력 값을 배열에 저장하였습니다.
- 모든 난쟁이의 키의 합을 구하였습니다.
- 빼야하는 난쟁이 2명을 구하는 dwarfCheck함수를 만들었습니다.
- dwarfCheck를 실행하여 빼야하는 난쟁이 2명의 키를 배열에서 -1로 변경하였습니다.
- Arrays.sort()를 이용하여 배열을 오름차순으로 정렬하였습니다.
- BufferedWriter에 배열[2~8]까지의 값들을 저장하였습니다.
- BufferedWriter에 저장된 결과값을 출력하였습니다.
- dwarfCheck은 2중 for문을 통해 난쟁이 2명을 뺄 수 있는 경우의 수를 만들었습니다.
- 경우의 수마다 모든 난쟁이의 키의 합에서 2명의 키를 빼서 합이 100이 되는지 확인하였습니다.
- 100이 된다면 해당 난쟁이 2명의 키를 -1로 변경하고 함수를 종료합니다.
결과 코드
import java.io.*;
import java.util.*;
public class Main{
static int dwarfMax = 9; //난쟁이 최대 명수
static int[] dwarf = new int[dwarfMax]; //난쟁이 키 저장 배열
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//입력값 처리하는 BufferedReader
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//결과값 출력하는 BufferedWriter
int sum = 0;
//-------입력값 저장 및 입력된 모든 난쟁이의 키의 합 구하기--------
for(int i=0;i<dwarfMax;i++) {
dwarf[i] = Integer.parseInt(br.readLine());
sum += dwarf[i]; //모든 난쟁이 키의 합
}
dwarfCheck(sum); //빼야하는 난쟁이 2명 구하기 함수 실행
Arrays.sort(dwarf); //난쟁이의 키 오름차순 정렬
for(int i=2;i<dwarfMax;i++)
bw.write(dwarf[i] + "\n"); //배열[2~8]값 BufferedWriter에 저장
bw.flush(); //결과 출력
bw.close();
br.close();
}
//-------빼야하는 난쟁이 2명 구하는 함수---------
public static void dwarfCheck(int sum) {
for(int i=0;i<dwarfMax;i++) {
for(int j=i+1;j<dwarfMax;j++) {
if(sum- dwarf[i] - dwarf[j]==100) { //2명 빼주었을 때 키의 합 100일 경우
//빼야하는 2 난쟁이의 키 -1로 변경
dwarf[i] = -1;
dwarf[j] = -1;
return; //함수 종료
}
}
}
}
}
'백준' 카테고리의 다른 글
[백준] 단계별로 풀어보기(단계:21,이분 탐색,JAVA)2805번, 나무 자르기 (0) | 2022.02.27 |
---|---|
[백준] code.plus(브루트포스,JAVA)3085번, 사탕 게임 (0) | 2022.02.27 |
[백준] 단계별로 풀어보기(단계:21,이분 탐색,JAVA)1654번, 랜선 자르기 (0) | 2022.02.26 |
[백준] 단계별로 풀어보기(단계:21,이분 탐색,JAVA)10816번, 숫자 카드 2 (0) | 2022.02.25 |
[백준] code.plus(수학,JAVA)6588번, 골드바흐의 추측 (0) | 2022.02.25 |
댓글