티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/43165

 

코딩테스트 연습 - 타겟 넘버 | 프로그래머스

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘

programmers.co.kr

public class Solution {

	public static void main(String[] args) {
		int[] numbers = { 1, 1, 1, 1, 1 };
		int target = 3;
		// which returns 5
		System.out.println(solution(numbers, target));
	}

	static int pos = 0;
	static int count = 0;

	static int solution(int[] numbers, int target) {
		int answer = 0;
		
		search(numbers, target);
		answer = count;

		return answer;
	}

	static void search(int[] numbers, int target) {
		if (pos == numbers.length && target == 0) { count++; return; }
		if (pos == numbers.length)	return;

		target = target - numbers[pos++];
		search(numbers, target);
		target = target + numbers[--pos];

		target = target + numbers[pos++];
		search(numbers, target);
		target = target - numbers[--pos];
	}

}

 

 루트 0에서 배열의 숫자 순서대로 더하는 경우(양의 경우)와 빼는 경우(음의 경우)로 나뉘는 트리 구조를 떠올리고, 재귀적인 방법으로 이를 순회하는, 그래프의 탐색 알고리즘을 사용하였다. 정점을 방문하는 순서는 깊이 우선 탐색과 유사하지만 트리 구조로 두 갈래로만 나뉘기 때문에 방문 여부는 체크는 하지 않고, 양의 경우를 처리한 후에 재귀하여 음의 경우를 처리한다. 

댓글