티끌모아 로키산맥 🏔
search
로ᄏl
배움에 끝은 없다... 개발 또한 그러하다.
Today
Yesterday
프로그래머스 코딩 테스트 연습문제: 타겟 넘버 (DFS/BFS)
문제출처: https://programmers.co.kr/learn/courses/30/lessons/43165
해당 문제는 고득점 Kit 문제에서 DFS/BFS 탐색 기법으로 풀 수 있는 문제라고 명시되어있다.
문제 설명:
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이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.
제한 사항
블로그에서 DFS와 BFS 알고리즘을 정리한 적이 있으나, 막상 실제로 써먹기가 쉽지 않았다. (결국 ..40분동안 삽질만 하다가 찾아보았다)
예제처럼 단순히 (같은 숫자) 1이 5개 주어진 경우에 초점을 맞춰서 풀었다가. 많은 오류를 범하였다.
이 문제는 BFS가 아닌 DFS의 개념을 이용한다. DFS는 stack 개념을 사용하거나 또는 재귀를 이용하여 구현할 수 있다.
참고한 코드는 재귀메소드를 이용하여 구현하였다.
연산과정을 하나의 Tree로 생각해 볼 때, '+' 연산자를 왼쪽 자식노드로 '-' 연산자를 오른쪽 자식노드로 내려가는 과정을 재귀 메소드를 사용하여 코드로 표현하였다.
public class Solution{
static int answer = 0;
public int solution(int[] numbers, int target) {
dfs(target, numbers, 0);
return answer;
}
public void dfs(int target, int[] numbers, int k) {
if (k == numbers.length) {
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
if (sum == target)
answer++;
return;
} else {
numbers[k] *= 1;
dfs(target, numbers, k + 1);
numbers[k] *= -1;
dfs(target, numbers, k + 1);
}
}
}
전역변수 answer를 선언하여, 결과값을 전역변수에 저장한다. (테스트 케이스 여러개 한번에 못 돌린다... 중첩되어 저장된다)
테스트 케이스 3개를 실행하였을 때, 정상적으로 결과값이 출력되었다.
numbers = { 1 , 1 , 1 , 1 , 1 }
target = 1
answer = 5
numbers = { 5 , 3 , 1 , 1 , 1 }
target = 1
answer = 4
numbers = { 5 , 4 , 3 , 2 , 1 }
target = 3
answer = 3
프로그래머스 코딩 테스트 연습문제: 여행경로 (0) | 2019.10.24 |
---|---|
프로그래머스 코딩 테스트 연습문제: 네트워크 (0) | 2019.10.22 |
프로그래머스 코딩테스트 연습: 문자열 내 마음대로 정렬하기 (0) | 2019.09.01 |
프로그래머스 코딩테스트 연습: 나누어 떨어지는 숫자 배열 (0) | 2019.08.30 |
프로그래머스 코딩테스트 연습: 같은 숫자는 싫어 (0) | 2019.08.29 |