
class Solution {
List<Integer> candidate = new ArrayList<>();
List<List<Integer>> answer = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(1, n, k);
return answer;
}
public void backtracking(int start, int n, int k) {
if (candidate.size() == k) {
answer.add(candidate);
candidate.remove(k-1);
}
if (start > n) {
break;
}
candidate.add(start);
backtracking(start+1, n, k);
}
}
에러 내용
error: break outside switch or loop
break;
^
break 문은 반복문(예: for, while)이나 switch 문 내에서 사용되어야 합니다. 여기서 break 문을 사용하려는 의도는 재귀 호출을 멈추고 싶은 것으로 보이는데, 이를 위해서는 return 문을 사용해야 합니다.
`break -> return' 수정

결과가 이상함. 다 같은 원소만 들어가있음
Java의 객체 참조와 관련한 이슈인데, candidate 리스트의 내용이 변경될 때 answer에 이미 추가된 리스트들도 함께 변경되는 문제가 발생한다.
객체 참조: Java에서 리스트와 같은 객체는 참조를 통해 다뤄집니다. 즉, 변수는 객체 자체가 아니라 객체를 가리키는 참조를 저장합니다.
리스트 추가: candidate 리스트를 answer 리스트에 추가할 때, 실제로 추가되는 것은 candidate 객체의 "참조"입니다. 즉, answer에 저장된 것은 candidate가 가리키는 객체의 메모리 주소입니다.
공유된 객체: answer 리스트에 candidate 리스트를 추가한 후, candidate의 내용을 변경하면, answer 리스트에 저장된 candidate 참조가 가리키는 객체가 동일하므로, answer 리스트 내의 해당 객체도 함께 변경됩니다. 이는 candidate와 answer 리스트가 같은 객체를 공유하고 있기 때문입니다.
예를 들어, 다음과 같은 상황을 생각해 볼 수 있다.
candidate에 [1, 2]를 추가하고, 이를 answer에 추가합니다.
candidate에서 2를 제거하고 3을 추가하여 [1, 3]으로 만듭니다.
이 변경은 candidate 뿐만 아니라, answer에 이미 추가된 리스트에도 영향을 미칩니다. 왜냐하면 answer의 리스트는 candidate가 가리키는 동일한 객체를 참조하기 때문입니다.
answer.add(candidate); 대신에 answer.add(new ArrayList<>(candidate));를 사용하여 candidate의 현재 상태를 복사한 새로운 리스트를 answer에 추가
if (start > n) {
break;
}
위처럼 return을 위한 조건문을 따로 만들 필요가 없고, if (candidate.size() == k) 여기서 해결할 수 있다.
class Solution {
List<List<Integer>> answer = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(1, n, k, new ArrayList<Integer>());
return answer;
}
public void backtracking(int start, int n, int k, List<Integer> current) {
if (current.size() == k) {
answer.add(new ArrayList<>(current));
return;
}
for (int i = start; i <= n; i++) {
current.add(i);
backtracking(i+1, n, k, current);
current.remove(current.size() - 1);
}
}
}