지구정복

[브루트포스] 백준 - 일곱 난쟁이 본문

데이터 엔지니어링 정복/Algorithm

[브루트포스] 백준 - 일곱 난쟁이

eeaarrtthh 2021. 8. 21. 21:13
728x90
반응형

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

 

2309번: 일곱 난쟁이

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

www.acmicpc.net

 

-문제해설

처음에는 처음부터 일일히 다 더해보려고 했다. 예를들면 

arr배열에 아홉 난쟁이의 키가 있다고 하면 아래 숫자는 arr의 인덱스를 나타낸다.

 

1 2 3 4 5 6 7

1 2 3 4 5 6 8

1 2 3 4 5 6 9

1 2 3 4 6 7 8

1 2 3 4 6 7 9

1 2 3 4 6 8 9

1 2 3 5 6 7 8

1 2 3 5 6 7 9

.....

 

하지만 이를 구현하는게 굉장히 까다로웠다. 결국 질문검색에서 힌트를 보고 풀 수 있었다.

 

처음에 난쟁이 키를 입력받을 때 전체 값을 sum에 더해서 아홉난쟁이 키의 합을 구한다.

그리고 출력조건에 오름차순으로 출력해야하니깐 미리 arr배열을 오름차순으로 정렬하고

이중 포문을 돌면서 

sum - ( 첫번째 인덱스 + 두번째 인덱스 ) == 100 인 경우를 찾는다.

 

위 조건을 만족하는 첫 번째와 두 번째 인덱스를 찾은 경우 변수 a와 b에 해당 인덱스값을 저장한다.

 

그리고 arr배열을 포문으로 순회하면서 인덱스값이 a와 b가 아닌 값들만 출력한다.

 

 

-자바

package bruteforce;

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

public class BJ2309 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		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 );
		
		int a = 0, b = 0;
		l:for( int i=0; i<arr.length; i++ ) {
			for( int j=i+1; j<arr.length; j++ ) {
				if( sum - (arr[i]+arr[j]) == 100 ) {
					a = i; b = j;
					break l;
				}
			}
		}
		
		StringBuilder sb = new StringBuilder();
		for( int i=0; i<arr.length; i++ ) {
			if( i == a || i == b ) continue;
			sb.append( arr[i] ).append( "\n" );
		}
		System.out.println( sb );
	}
}

 

-파이썬

from sys import stdin
input = stdin.readline
arr = []; hap = 0
for i in range( 9 ):
    arr.append( int( input() ) )
    hap += arr[i]

arr.sort()
bre = False
for i in range( len(arr) ):
    for j in range( i+1, len(arr) ):
        if hap - ( arr[i] + arr[j] ) == 100:
            for k in range( len(arr) ): 
                if k == i or k == j: continue
                else: print( arr[k] )
            bre = True
            break
    if bre: break
728x90
반응형
Comments