c언어 주사위 경우의 수 구하기입니다.
조회수 3010회
질문 문제입니다.
- 10 이하의 자연수 N을 입력받아 주사위를 N번 던져서 나올 수 있는 모든 경우를 출력하되 중복되는 경우에는 앞에서부터 작은 순으로 1개만 출력하는 프로그램을 작성하시오.
출력입니다. (3을 입력 했을 때)
1 1 1
1 1 2
...
1 1 6
1 2 2
1 2 3 ...
5 6 6
6 6 6
이 문제에서 재귀함수를 사용하는 게 좋은가요? 일단 제가 배열, 함수 실력이 초급 정도입니다. 이거 문제 2시간 정도 봤는데도 이해하기 힘듭니다.. 좀 쉽게 이해 시켜 주실 분 계신가요 ㅠㅠ?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
우리는 수학을 배웠으니, 좀더 배짱 있게 접근해 봅시다.
사용자가
3
을 입력했다면, 어차피 출력해야 할 가짓수는6^3 = 216
가지입니다.그러면
for
를216
번 돌면 됩니다.1부터 216까지 돌면서 출력을 하겠죠.
i
번째 출력을 할 때를 생각해 봅시다. (* 원래 iterator라는 건0
부터 시작하는 것이지만 편의상 여기서는 이산수학의 차원에서1
부터 시작하는 것으로 함)
제일 쉬운 거부터 생각해 봅시다.
세번째 숫자는 뭐가 될까요?
i % 6
연산의 결과, 즉i
를 6으로 나눈 나머지가 세번째 숫자가 됩니다.i
가1
일 때111
이 출력되잖아요.1 % 6 = 1
.
두번째 숫자는 뭐가 될까요?
i
가1
~6
일 때는 확실히1
입니다.i
가7
일 때부터는12x
형태이니까 두번째 숫자가2
가 됩니다.i
가12
일 때까지2
가 되겠군요.i
가18
이거나 그보다 작을 때는3
이 될 거구요.조금 생각해 봅니다.
i
를6^1 = 6
으로 나눈 다음, 소수점은 올림하고, 그걸 6으로 나눈 나머지가 두번째 숫자가 되겠네요.왜
6^1
이냐? 두번째 숫자가 공통되게1
인 경우는, 다른 건 다 같고 세번째 숫자만 6번 변하고 있는 경우이기 때문입니다.
첫번째 숫자는 뭐가 될까요?
i
가1
~36
일 때는1xx
형태일 테니까 확실히1
입니다.i
가37
~36*2
일 때는2xx
형태일 테니 아마2
일 겁니다.음 이제 슬슬 뭐가 어떻게 되어가는지 알 것 같군요.
i
를6^2 = 36
으로 나눈 다음, 소수점은 올림하고, 그걸6
으로 나눈 나머지가 첫번째 숫자가 되겠군요.
6^2
가 나왔으니 말인데, 혹시 4자리 수를 출력해야 하는 경우라면 그때의 첫번째 숫자는 뭐가 될까요?혹시
i
를6^3 = 216
으로 나눈 다음, 소수점은 올림하고, 그걸 6으로 나눈 나머지... 일까요?그리고 그때에도 4번째 숫자는
i
를6
으로 나눈 나머지이고...잠깐만, 혹시 그러면, 사실 주사위를
n
번 던져서 나올 수 있는 모든 가짓수의 나열에서,m
번째 숫자라는 건 사실은i
를6^(n-m)
으로 나누고, 소수점을 올림하고, 그걸 6으로 나눈 나머지였던 걸까요?! 앞에서 유도한 공식들을 지금 좀 다시 봤는데... 이거 맞는거 같은데? 질문자님 생각은 어때요?
이상의 풀이는 지극히 수학적인 접근이며 공학이 1도 사용되지 않고 있습니다. 아마 출제자가 원한 것은 재귀적 접근이 맞을 것입니다. 문자열의 목록을 입력받아, 각 문자열 뒤에 1~6의 문자를 하나 더 붙인 결과들로 이루어진 문자열의 목록을 반환하는 함수가 핵심적으로 필요합니다. 하지만 지금 질문자님의 프로그래밍 이해 수준에서 이런 접근은 불가능합니다. 그냥 순순히 "선생님 저는
for
를 이해했고 문제를 풀기 위한 방안을 다각도로 접근할 줄 압니다"까지만 어필하도록 합시다.행운을 빕니다. Wish your godspeed.
댓글 입력