프로그래밍/Algorithm

0번부터 차례대로 번호 매겨진 n개의 원소 중 4 개를 고르는 모든 경우를 출력하라

모지사바하 2015. 8. 27. 17:37
public void selectArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length + 3; j++) {
for (int k = j + 1; k < arr.length; k++) {
for (int l = k + 1; l < arr.length; l++) {
System.out.println(arr[i] + ", " + arr[j] + ", " + arr[k] + ", " + arr[l]);
}
}
}
}

회고. 

0번부터 차례대로 번호 매겨진 n개의 원소 중 4개를 구하는 것이라면 굳이 배열을 쓸 필요가 없었다.


그냥


public void selectArr(int n) {
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
for (int l = k + 1; l < n; l++) {
System.out.println(i + ", " + j + ", " + k + ", " + l);
}
}
}
}

처럼 해결하면 된다.


그런데 n개의 원소가 100이 되고 , 이중 30개를 구하는 모든 경우를 구하려면 이런 방식으론 안된다.


재귀로 다시 풀어보자.


public void selectArrRecursive(int n, List<Integer> l, int toPick) {
int smallest = l.size();

if (toPick == 0) {
System.out.println(l.stream().map(String::valueOf).collect(joining(", ")));
return;
}

for (int i = smallest; i < n; i++) {
l.add(i);
selectArrRecursive(n, l, toPick - 1);
l.remove(l.size() - 1);
}
}

처음에 배열로 풀었었기 때문에 이 문제 역시 배열을 받아서 풀려고 오랜시간 낑낑대다가,, 결국 책을 봐버렸다..


쉬울거같다는 예상과는 달리 무지 어려웠다.


n : 전체 원소의 개수

l : 지금까지 고른 원소 리스트

toPick : 앞으로 더 담아야 할 원소 개수


앞으로 담아야할 원소의 개수가 다 담기면 출력해주고

마지막으로 리스트에 담았던 원소를 제거하고 다음 원소를 담고 재귀.


아.. 왜이렇게 어렵지? 머리가 나쁜가..