본문 바로가기
백준

[백준] code.plus(브루트포스,JAVA)2309번, 일곱 난쟁이

by 열정적인 이찬형 2022. 2. 26.

문제 링크

 

2309번: 일곱 난쟁이

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

www.acmicpc.net


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

브루트 포스란.

모든 경우의 수를 대입시켜서 가장 알맞은 경우의 수를 결과로 출력하는 것입니다.

 

그래서 이 문제를 정말 간단하게 생각하여 for문을 반복하면 되는 문제로 생각해보았는데 for문을 계속 반복하면 코드가 효율적으로 진행될 것 같다고 생각하지 않았습니다.

 

조금 고민을 하다가 떠오른 생각은 난쟁이의 키를 더해서 100을 맞추지 말고 빼서 맞춰주면 for문을 2번 쓰면 표현할 수 있겠다고 생각이 떠올라서 그 방식으로 문제를 해결하였습니다.

 

문제에 해결알고리즘은

1. 입력된 난쟁이의 키를 모두 더합니다.

2. 2중 for문을 통해서 2명을 제거할 수 있는 경우의 수를 구하였습니다.

3. 경우의 수마다 모두 더한 값에 2명의 키를 빼주었을 때 값이 100이 되는지 확인하였습니다.

4. 100이 되었을 때에는 빼준 2명의 난쟁이의 키를 -1로 설정하고 반복을 종료하였습니다.

5. 난쟁이의 키가 저장된 배열을 오름차순으로 정렬하였습니다.

6. 빼준 2명의 난쟁이의 키가 -1로 배열[0], 배열[1]의 값이 될 것으로 2~8의 배열의 값을 오름차순으로 출력하였습니다.

 

  • BufferedReader를 사용하여 입력 값을 배열에 저장하였습니다.
  • 모든 난쟁이의 키의 합을 구하였습니다.
  • 빼야하는 난쟁이 2명을 구하는 dwarfCheck함수를 만들었습니다.
  • dwarfCheck를 실행하여 빼야하는 난쟁이 2명의 키를 배열에서 -1로 변경하였습니다.
  • Arrays.sort()를 이용하여 배열을 오름차순으로 정렬하였습니다.
  • BufferedWriter에 배열[2~8]까지의 값들을 저장하였습니다.
  • BufferedWriter에 저장된 결과값을 출력하였습니다.
  • dwarfCheck은 2중 for문을 통해 난쟁이 2명을 뺄 수 있는 경우의 수를 만들었습니다.
  • 경우의 수마다 모든 난쟁이의 키의 합에서 2명의 키를 빼서 합이 100이 되는지 확인하였습니다.
  • 100이 된다면 해당 난쟁이 2명의 키를 -1로 변경하고 함수를 종료합니다.

 

결과 코드

import java.io.*;
import java.util.*;
public class Main{
	static int dwarfMax = 9;	//난쟁이 최대 명수
	static int[] dwarf = new int[dwarfMax];	//난쟁이 키 저장 배열
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //입력값 처리하는 BufferedReader
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        //결과값 출력하는 BufferedWriter
        int sum = 0;
        //-------입력값 저장 및 입력된 모든 난쟁이의 키의 합 구하기--------
        for(int i=0;i<dwarfMax;i++) {
        	dwarf[i] = Integer.parseInt(br.readLine());
        	sum += dwarf[i];		//모든 난쟁이 키의 합
        }
        dwarfCheck(sum);	//빼야하는 난쟁이 2명 구하기 함수 실행
        
        Arrays.sort(dwarf);	//난쟁이의 키 오름차순 정렬
        for(int i=2;i<dwarfMax;i++)
        	bw.write(dwarf[i] + "\n");	//배열[2~8]값 BufferedWriter에 저장
        bw.flush();		//결과 출력
        bw.close();
        br.close();
    }
    //-------빼야하는 난쟁이 2명 구하는 함수---------
    public static void dwarfCheck(int sum) {
    	for(int i=0;i<dwarfMax;i++) {
    		for(int j=i+1;j<dwarfMax;j++) {
    			if(sum- dwarf[i] - dwarf[j]==100) {	//2명 빼주었을 때 키의 합 100일 경우
                		//빼야하는 2 난쟁이의 키 -1로 변경
    				dwarf[i] = -1;
    				dwarf[j] = -1;
    				return;		//함수 종료
    			}
    		}
    	}
    }

}

댓글