DY N DY

기초다지기 함수3-자가진단4(C++) 본문

PARK/ALGORITHM

기초다지기 함수3-자가진단4(C++)

손세지 2016. 6. 30. 14:23

590 : 함수3 - 자가진단4

제한시간: 1000 ms    메모리제한: 0 MB
해결횟수: 519 회    시도횟수: 1096 회   



10 이하의 자연수 N을 입력받아 주사위를 N번 던져서 나올 수 있는 모든 경우를 출력하되 중복되는 경우에는 앞에서부터 작은 순으로 1개만 출력하는 프로그램을 작성하시오.



 [Copy]
3
 [Copy]
1 1 1
1 1 2
...
1 1 6
1 2 2
1 2 3
...
5 6 6
6 6 6
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**************************************************************
    Problem: 590
    User: a132034
    Language: C++
    Result: Success
    Time:31 ms
    Memory:1740 kb
****************************************************************/
 
 
#include    <iostream>
using namespace std;
 
static int dice[11];
static int loc = 1;
 
void cases(int N)
{
    for (int i = dice[loc-1]; i <= 6; ++i)
    {
        dice[loc] = i;
 
        if (loc == N)
        {
            for (int j = 1; j <= N; ++j)
                cout << dice[j] << " ";
            cout << endl;
        }
        else
        {
            loc++;
            cases(N);
            loc--;
        }      
    }
}
 
int main()
{
    int N;
    cin >> N;
    dice[0] = 1;
 
    cases(N);
 
    return 0;
}

이전 푼 주사위 문제와 크게 다를 바 없는 문제였다. 

그저 중복을 피하기 위해 해당 위치의 주사위값은 이전 위치의 주사위값부터 시작하는 것으로. (그래야 작은 수 부터 나오므로..)

[도움말 접기]

"1 1 2", "1 2 1", "2 1 1"은 모두 1이 두 번  2가 한 번 나온 경우이므로 중복이다. 이러한 경우 앞에서부터 작은순으로"1 1 2"한 가지만 출력해야 한다.
현재의 레벨(arr[i])에 담을 값을 1부터가 아니라 이전 레벨에 담겨있는 값(arr[level-1])부터로 정하면 된다. 이 경우 level[0]에는 어떤 값을 넣어야 
할지 잘 생각해 보자.

도움말도 동일.


추가적으로.. if문이 끝나고 함수를 마치면 모든 경우의 수가 출력되지 않으므로 return을 쓰지 않아야 한다(27~28line 사이)

아무생각없이 return을 써 두었다가.. 한5분여가량 헤메고는 한줄한줄 눈디버깅한 결과.. return 때문이라는 것을 알아내었다.