[백준 2309번] 일곱 난쟁이

2022. 4. 21. 11:39코딩 테스트(JAVA)/백준

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

 

2309번: 일곱 난쟁이

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

www.acmicpc.net

문제

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.

아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.

아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

입력

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

출력

일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다.

예제 입력 1 복사

20
7
23
19
10
15
25
8
13

예제 출력 1 복사

7
8
10
13
19
20
23

 

문제 분석

1. 9명의 난쟁이의 키를 입력받을 배열을 선언합니다.(height)

2. 키 배열 오름차순 합니다.

3. 키 배열을 돌면서 총합(sum)이 100이 될 때까지 더한 후 출력합니다. 

 

 

실패 코드


import java.util.*;
public class  Main {

	public static void main(String[] args) {
		Scanner kb = new Scanner(System.in);
		// 키 담을 배열 선언
		int[] height = new int[9];
		for(int i=0; i<height.length; i++) {
			height[i] = kb.nextInt();
		}
		Arrays.sort(height);
		
		// 난쟁이 키의 합과 100을 비교하는 임시변수 선언
		int sum = 0;
		
		for(int i=0; i<height.length; i++) {
			if(sum != 100) {
				sum += height[i];
			}else {
				System.out.println(height[i]);
			}
		}
	}

}

여기서 제일 중요한 부분을 고려하지 않고 넘어갔습니다.

💡 난쟁이 9명 중에 7명의 키를 더한다는 것입니다.

이때 사용하는 알고리즘은 

 

 

브루트 포스(brute force) 알고리즘입니다. 

완전 탐색 알고리즘으로 가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져온다.

= 순서 노가다 알고리즘 

대표적인 예로는 별 찍기가 있습니다.

 

이를 반영해서 코드 구현을 다시 해보겠습니다. 

 

 

성공 코드


import java.util.*;
public class Main {

	public static void main(String[] args) {
		Scanner kb = new Scanner(System.in);
		int[] height = new int[9];
		int sum = 0;  
		// 가짜 난쟁이 2명 넣을 변수
		int fakeDwarf1 = 0;
		int fakeDwarf2 = 0;
		
		for(int i=0; i<height.length; i++) {
			height[i] = kb.nextInt();
			sum += height[i];
		}
		Arrays.sort(height);
		// sum = 키 9명 전부 더한 상태 , sum -fakeDwarf1 -fakeDwarf2 == 100만족시 출력
		// 부루트포스 알고리즘                
		for(int i=0; i<height.length; i++) {
			for(int j=0; j<height.length; j++) {
				if(sum - height[i] - height[j] == 100) {
					fakeDwarf1 = height[i];  
					fakeDwarf2 = height[j];
				}
			}
		}
		
		for(int k=0; k<height.length; k++) {
			if(!(height[k] == fakeDwarf1 || height[k] == fakeDwarf2)) {
				System.out.println(height[k]);
			}
		}
		
	}

}