backtracking(3)
-
[Array] Combination Sum
candidates 배열과 target 숫자가 주어질 때, candidtates 배열의 부분집합 원소합이 target이 되는 부분집합들을 배열로 다시 만들어 리턴하는 문제이다. 단, candidates의 원소는 중복해서 여러번 사용할 수 있다. 구체적으로 설명하기 위해 콘솔을 찍었다. subset, sum, index를 args로 가진 search 라는 함수를 재귀로 사용한다. 이때 subset은 true라면 리턴배열에 넣을 부분합, sum은 target과 같은 값을 가지는지 여부 확인을 위한 원소의 합, index는 검사를 위한 요소를 가리키는 숫자이다. 실제 콘솔값을 보면 가능한 조합에 대해 모두 검사함을 알 수 있다. 로직을 돌리기 전 오름차순으로 정렬하고 element마다 하나씩 검사한다. 각 e..
2021.03.29 -
[backtracking] Generate Parentheses
Leetcode에 분류가 backtracking으로 있어서 소제목을 그렇게 붙이긴 했는데, 어느 범주에 넣어야 할지 모르겠는 문제 무튼 Parentheses문제는 이전에 stack으로 한번 풀었지만, 요 문제는 범주가 다르다 숫자가 주어지면, 그 갯수만큼 well-formed한 parentheses를 만들어야 한다. recursion을 이용했다. 예를들어 n이 3이라면, 괄호가 총 3짝이 쓰였다는 뜻인데, 일일이 만들기에는 일일이 Loop를 도는것보다, 재귀가 더 간편할거라 생각했기 때문이다. recursion 함수는 결과배열, 괄호모양, n을 args로 받는다 이때 n은 left, right로 나누어 받을것이고, 이를 recursion에 이용할때 괄호의 모양을 다르게 한다. left와 right가 0이..
2021.03.26 -
[Array] Permutations
배열이 주어지면 해당 원소들로 만들 수 있는 순열 케이스를 모두 구하는 문제 input이 아예 없거나 하나인 경우는 일단 걸러준다. 이후 Loop를 돌면서, 순회 차례가 된 원소를 제외하고 나머지를 recursion으로 넘겨준다. 이때 recursion의 결과인 res는 배열로 나올것이므로, 다시 순회하며 결과를 하나씩 만들어준다. 이렇게 하는 이유는, 나머지를 가지고 만든 순열의 경우의 수에 순회 차례가 된 원소만 concat으로 붙여주면 해당 배열로 만들 수 있는 모든 경우의 수가 되기 때문이다. 이러한 행위를 순회하면 모든 경우의 수를 구할 수 있다.
2021.03.26