코테/JAVA

[백준 2309/ JAVA] 일곱난쟁이

쇼티드 2024. 1. 15. 01:05
728x90
반응형

https://www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

간단한(?) 브루트포스 문제이다.

 

난 먼저 모든 난쟁이의 키를 합친 후 100을 뺀 값을 구했다.

그 후 두 난쟁이의 키의 합이 100에서 전체 키를 뺀 값과 같은 경우를 구했다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    static int[] n = new int[9];

    public static void main(String[] args) throws IOException {
        int sum = 0, value;
        int i, j;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        for (i = 0; i < 9; i++) {
            n[i] = Integer.parseInt(br.readLine());
            sum += n[i]; //난쟁이 키 합
        }

        value = sum - 100; //100을 뺀 값
        Arrays.sort(n);

        for (i = 0; i < 8; i++) {
            for (j = i + 1; j < 9; j++) {
                if (i != j && (n[i] + n[j]) == value) { //난쟁이의 키의 합이 같은 경우
                    printResult(n, i, j);
                    return;
                }
            }
        }
    }
    
    //결과 출력
    public static void printResult(int[] n, int i, int j) {
        for (int p = 0; p < 9; p++) {
            if (p != i && p != j)
                System.out.println(n[p]);
        }
    }
}

 

나중에 다른 풀이를 보니 제외할 두 난쟁이의 키를 100으로 바꾸고 정렬한 후 오름차순으로 7명만 출력하는 풀이도 있었다.

이 풀이가 훨씬 효과적이다.

 

수정한 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    static int[] n = new int[9];

    public static void main(String[] args) throws IOException {
        int sum = 0, value;
        int i, j;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        for (i = 0; i < 9; i++) {
            n[i] = Integer.parseInt(br.readLine());
            sum += n[i]; // 난쟁이 키 합
        }

        value = sum - 100; // 100을 뺀 값

        for (i = 0; i < 8; i++) {
            for (j = i + 1; j < 9; j++) {
                if (i != j && (n[i] + n[j]) == value) { // 난쟁이의 키의 합이 같은 경우
                    //제외할 두 난쟁이 키를 100
                    n[i] = 100;
                    n[j] = 100;
                    //정렬
                    Arrays.sort(n);
                    printResult(n);
                    return;
                }
            }
        }
    }

    // 결과 출력
    public static void printResult(int[] n) {
        for (int p = 0; p < 7; p++) { //7명만 출력
            System.out.println(n[p]);
        }
    }
}

 

수정한 풀이가 시간이 더 걸리는 이유는 뭘까..?

728x90
반응형

'코테 > JAVA' 카테고리의 다른 글

[백준 3085 / JAVA] 사탕 게임  (1) 2024.01.15
[백준 2231 / JAVA] 분해합  (1) 2024.01.15
[백준 17837 / JAVA ] 새로운 게임 2  (0) 2023.08.23
[백준 14501 / JAVA] 퇴사  (0) 2023.08.17
[백준 23288/JAVA] 주사위 굴리기2  (0) 2023.08.03