[BOJ 2309] 일곱 난쟁이 (java)

1 minute read

:pencil2: 문제 링크

문제풀이

package basics_500;

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

public class BOJ2309 {
	static int liarSum = 0;
	static int first = 0, second = 0;

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int sum = 0;
		// 9명의 키를 받을 배열
		int[] array = new int[9];
		boolean[] visited = new boolean[9];

		//난쟁이들 키 입력 받음 
		for (int i = 0; i < 9; i++) {
			array[i] = Integer.parseInt(br.readLine());
			sum += array[i];
		}
		//7명 난쟁이의 합은 100이기 때문 거짓말 하는 난쟁이들 2명의 키 합은 100을 뺀 나머지 
		liarSum = sum - 100;

		// 9명중 2명을 뽑기
		combination(array, visited, 0, array.length, 2);

		//오름차순으로 정렬 후 
		Arrays.sort(array);
		//거짓말하는 난쟁이들의 키를 제외하고 출력 
		for (int n : array) {
			if (n == first)
				continue;
			if (n == second)
				continue;
			System.out.println(n);

		}

	}
	
	//백트래킹 
	static void combination(int[] arr, boolean[] visited, int start, int n, int r) {
		//r만큼 다뽑았다면(뽑을만큼 뽑았다면)   
		if (r == 0) {
			//뽑은 두명의 난쟁이가 거짓말하는 난쟁이인지 체크 
			findLiar(arr, visited, n);
			return;
		}
		//ex) 0번째 요소 뽑았으면 visited=true 해주고,
		// 그 다음 인덱스부터 시작하는 나머지 배열 요소중 다시 뽑기 
		for (int i = start; i < n; i++) {
			visited[i] = true;
			combination(arr, visited, i + 1, n, r - 1);
			visited[i] = false;
		}
	}

	static void findLiar(int[] arr, boolean[] visited, int n) {
		int sum = 0;
		for (int i = 0; i < n; i++) {
			if (visited[i] == true) {  
				sum += arr[i]; // 뽑힌 난쟁이 들의 키 합계를 구해서
				if (liarSum == sum) { //liarSum과 같다면, 거짓말하는 난쟁이들 발견 
					first = sum - arr[i];
					second = arr[i];
				}

			}

		}
	}

}

Comments