티스토리 뷰
Problem
Find all valid combinations of k numbers that sum up to n such that the following conditions are true:
Only numbers 1 through 9 are used.
Each number is used at most once.
Return a list of all possible valid combinations. The list must not contain the same combination twice, and the combinations may be returned in any order.
Example 1:
Input: k = 3, n = 7
Output: [[1,2,4]]
Explanation:
1 + 2 + 4 = 7
There are no other valid combinations.
Example 2:
Input: k = 3, n = 9
Output: [[1,2,6],[1,3,5],[2,3,4]]
Explanation:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
There are no other valid combinations.
Example 3:
Input: k = 4, n = 1
Output: []
Explanation: There are no valid combinations.
Using 4 different numbers in the range [1,9], the smallest sum we can get is 1+2+3+4 = 10 and since 10 > 1, there are no valid combination.
Constraints:
- 2 <= k <= 9
- 1 <= n <= 60
Solution
더해서 n을 만들 수 있는 k개의 숫자로 구성된 조합을 모두 구하는 문제입니다.
숫자는 1~9까지 주어지고, 각 숫자는 한 번만 사용할 수 있습니다.
DFS를 사용해 풀이할 수 있습니다.
package io.lcalmsky.leetcode.combination_sum_iii;
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> list = new ArrayList<>();
dfs(result, list, k, 1, n);
return result;
}
private void dfs(List<List<Integer>> result, List<Integer> list, int k, int start, int sum) {
if (sum < 0) { // (1)
return;
}
if (sum == 0 && list.size() == k) { // (2)
result.add(new ArrayList<>(list));
return;
}
for (int i = start; i <= 9; i++) { // (3)
list.add(i);
dfs(result, list, k, i + 1, sum - i); // (4)
list.remove(list.size() - 1); // (5)
}
}
}
- 숫자들의 합이 sum을 넘어간 것이므로 결과에 추가하지 않습니다.
- k개의 숫자들의 합이 sum일 때 결과에 추가합니다.
- 1~9까지 반복하면서 임시 리스트에 숫자를 추가하고
- 해당 숫자만큼 sum에서 제외하고 인덱스를 증가시킨 후 재귀호출 합니다.
- 모두 끝났을 때 임시 리스트의 마지막 값을 제거합니다.
Test
package io.lcalmsky.leetcode.combination_sum_iii;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import org.junit.jupiter.api.Test;
class SolutionTest {
@Test
public void givenNumberAndSum_whenFindCombinations_thenCorrect() {
assertAll(
() -> test(3, 7, List.of(
List.of(1, 2, 4)
)),
() -> test(3, 9, List.of(
List.of(1, 2, 6),
List.of(1, 3, 5),
List.of(2, 3, 4))
)
);
}
private void test(int k, int n, List<List<Integer>> expected) {
// when
Solution solution = new Solution();
List<List<Integer>> actual = solution.combinationSum3(k, n);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
905. Sort Array By Parity (0) | 2022.05.20 |
---|---|
1209. Remove All Adjacent Duplicates in String II (0) | 2022.05.19 |
17. Letter Combinations of a Phone Number (0) | 2022.05.14 |
581. Shortest Unsorted Continuous Subarray (0) | 2022.05.13 |
1679. Max Number of K-Sum Pairs (0) | 2022.05.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- JPA
- Spring Boot JPA
- Linux
- Spring Boot Tutorial
- leetcode
- 스프링 부트 튜토리얼
- 스프링 데이터 jpa
- 스프링부트
- spring boot application
- gRPC
- 스프링 부트 회원 가입
- QueryDSL
- proto3
- @ManyToOne
- JSON
- Jackson
- spring boot app
- Java
- 스프링 부트
- 알고리즘
- 함께 자라기 후기
- Spring Data JPA
- Spring Boot
- 클린 아키텍처
- 스프링 부트 애플리케이션
- intellij
- 함께 자라기
- r
- 헥사고날 아키텍처
- spring boot jwt
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함