본문 바로가기
Programming/Algorithm(ACM Problems)

[백준] 2309번 : 일곱난쟁이 / [자바] JAVA / 학습기록

by jongmln_ 2022. 1. 21.

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

 

2309번: 일곱 난쟁이

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

www.acmicpc.net


[백준] 2309번 : 일곱난쟁이 문제
[백준] 2309번 : 일곱난쟁이 입출력예제


[전체 코드]

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] num = new int[9]; //9명의 난쟁이 키를 입력받을 배열
		int spyA = 0, spyB = 0; //스파이 난쟁이 인덱스를 넣어줄 변수
		int sum = 0; 
		
		for(int i=0;i<num.length;i++) { //난쟁이 키 입력
			num[i] = sc.nextInt();
			sum += num[i]; //입력받은 키 합산
		}
		
		Arrays.sort(num); //출력은 정렬된 배열이기때문에 정렬
		
		for(int i=0;i<num.length-1;i++) { //브루프포스 탐색법
			for(int j=i+1;j<num.length;j++) {
				if(sum - num[i] - num[j] == 100) { //합계에서 스파이 두명을 뺸 값이 100이면
					spyA = i; //인덱스를 넣어준다.
					spyB = j;
					break;
				}
			}
		}

		for(int i=0;i<num.length;i++) {
			if(i == spyA || i == spyB) { //스파이가 있는 인덱스 
				continue; //건너뛰기
			}
			System.out.println(num[i]);
		}
	}
}

[제출 결과]

제출 결과


일곱난쟁이 문제는 도저히 풀 방법이 떠오르지 않아 킵해놓았다가 블랙잭 문제를 맞닥뜨리고 굉장히 유사하다고 생각해서 다시 일곱난쟁이로 돌아와 구글링을 통해 답을 얻었다.

그 해답은 바로 알고리즘 기법 중 하나인 부르트포스 탐색법이다.

Brute (짐승적인, 야만한, 난폭한) / Force (힘) = 뜻은 야만적인 난폭한 느낌의 힘이라는 뜻인데 알고리즘 기법에 이 뜻이 드러난다. 부르트포스 알고리즘기법은 하나하나 모든 경우의 수를 탐색하면서 정답을 찾아내는 기법이다.

따라서 어떻게보면 굉장히 무식한 방법이지만 오로지 부르트포스로만 풀리는 문제가 있기에 알고있어야 하는 알고리즘 기법이다.