백준/코드 플러스 (알고리즘 기초 - 2) (완)

[백준] 2309번 - 일곱 난쟁이 (!) (JAVA)

MoveForward 2023. 2. 9. 19:08

[백준] 2309번 - 일곱 난쟁이 (!) (JAVA)


[접근 방법]

브루트포스 알고리즘 방식으로 모든 경우의 수를 고려해야 한다.

 

 9명의 난쟁이 키의 합 중 2명의 키를 뺀 값이 100 인 경우를 찾아야 한다.

9개중 2개를 선택하여 빼는 모든 경우를 구현하고, 남은 7개의 합이 100이 되는 순간의 7개의 값을 정렬한 후 출력한다.

 

 


[JAVA 코드]

// 2309번 - 일곱 난쟁이
import java.util.*;
import java.io.*;

public class Main {
    
    public static void main(String[] args) throws IOException {
       
        // 0. 입출력 선언 / 초기화
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int[] arr = new int[9];
        int sum = 0;
        for(int i=0; i<9; i++){
            arr[i] = Integer.parseInt(br.readLine());
            sum += arr[i];
        }

        Arrays.sort(arr);

        // 1. 9명의 키의 합 중 2명의 키를 뺀 합이 100인 경우 찾기 + 2개의 값 삭제
        for(int i=0; i<8; i++){
            for(int j=i+1; j<9; j++){
                if (sum - arr[i] - arr[j] == 100){
                    arr[i] = 0;
                    arr[j] = 0;


                    // 2. 정렬 + 출력
                    Arrays.sort(arr);
                    for(int k=2; k<9; k++){
                        bw.write(arr[k] + "\n");
                    }
                    bw.flush();
                    bw.close();
                    br.close();

                    return; // main 함수를 곧바로 종료
                }
            }
        }

    }
}

[Rewind]

 

1. 어려웠던 점

- "9개 중 2개를 뺀 값이 100이 되는 경우" 를 생각해내지 못하였다.

 

2. 알게된 점

        // 1. 9명의 키의 합 중 2명의 키를 뺀 합이 100인 경우 찾기 + 2개의 값 삭제
        for(int i=0; i<8; i++){
            for(int j=i+1; j<9; j++){
                if (sum - arr[i] - arr[j] == 100){
                    arr[i] = 0;
                    arr[j] = 0;
                    break;
                }
            }
        }

        // 2. 정렬 + 출력
        Arrays.sort(arr);
        for(int i=2; i<9; i++){
            bw.write(arr[i] + "\n");
        }
        bw.flush();
        bw.close();
        br.close();
    }
}

처음은 위와 같이 코드를 작성하였으나, 2중첩 for문의 가장 안쪽에서 break를 실행하면, 한개의 for문만 실행 중지 된다.

따라서 "sum - arr[i] - arr[j] == 100" 이 되는 순간 arr를 출력하고 프로그램이 종료되어야 한다.

if문을 만족한다면, 즉시 arr를 출력하고 return을 통해 main 실행 함수를 종료한다.

// 1. 9명의 키의 합 중 2명의 키를 뺀 합이 100인 경우 찾기 + 2개의 값 삭제
        for(int i=0; i<8; i++){
            for(int j=i+1; j<9; j++){
                if (sum - arr[i] - arr[j] == 100){
                    arr[i] = 0;
                    arr[j] = 0;


                    // 2. 정렬 + 출력
                    Arrays.sort(arr);
                    for(int k=2; k<9; k++){
                        bw.write(arr[k] + "\n");
                    }
                    bw.flush();
                    bw.close();
                    br.close();

                    return; // main 함수를 곧바로 종료
                }
            }
        }

 

3. 개선 방향

- 비슷한 문제를 여러개 풀어야 한다.