1번 부터 n까지 번호가 적힌 구슬이 있습니다. 이 중
중복을 허락
하여 m번을 뽑아일렬로 나열
하는 방법을 모두 출력한다.
여기서 키워드 중복을 허락
, 일렬로 나열
에 집중해야 한다. 일렬로 나열은 순열을 의미하고, 중복을 허락함으로써 중복 순열
이 되기 때문이다.
int n // (구슬 갯수)
,
int m // (뽑는 횟수)
,
int pm[] // (수열 값을 담는 배열)
,
int L // (현재 레벨)
,
DFS() 메서드 // 핵심 로직
nPr
이 된다.n!/(n-r)!
을 의미한다. 또한,n>r
조건을 만족해야 한다.1박2일
에서 주로 하던 게임을 예시로 들 수 있다. 만약 5가지의 음식을 제작진이 준비했는데,n!/(n-r)!
과 같은 의미를 가진다.중복을 허용하는
순열은 어떻게 다를까?3^3
의 경우의 수를 가질 수 있게 된다.1 1 1
1 1 2
1 1 3
1 2 1
1 2 2
...
3 3 1
3 3 2
3 3 3
public void DFS(int L){
if(L == m){
for(int x : pm) System.out.print(x + " ");
System.out.println();
}
}else{
for(int i = 1; i <= n; i++){
pm[L] = i;
DFS(L+1);
}
}
}
1,1
이 출력되는 스택 프레임은 아래 이미지와 같다.
아래 이미지는 DFS 알고리즘을 그래프 형식으로 그린 이미지다.
결국 많이 풀어봐야 한다
모르는 문제를 마주하는 순간이 앞으로도 많을텐데
효과적으로 문제에 접근하고 풀이하는 방법을 고민해봐야할 것 같다.
의심하지말자, 인내하자, 포기하지말자!
문제 풀이가 막혀서
"나는 왜 이렇게 멍청할까..", "내가 이 문제를 풀 수 있을까?"
라는 생각이 들면서 스스로를 의심했는데,
"문제를 풀 때까지 일어나지 말자!", "포기하지 말고 계속 나아가자!"라고 생각하며 문제를 풀었던 것 같다.