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시간 정도 봤는데도 이해하기 힘듭니다.. 좀 쉽게 이해 시켜 주실 분 계신가요 ㅠㅠ?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 미안한 이야기지만...배열, 함수 다루는 실력이 부족하다면 쉽게 이해시켜드릴 수가 없습니다. c언어 튜터리얼을 다시 공부하는 것이 어떨까 합니다. 정영훈 2020.2.7 21:52

1 답변

  • 우리는 수학을 배웠으니, 좀더 배짱 있게 접근해 봅시다.


    사용자가 3을 입력했다면, 어차피 출력해야 할 가짓수는 6^3 = 216가지입니다.

    그러면 for216번 돌면 됩니다.

    1부터 216까지 돌면서 출력을 하겠죠.

    i번째 출력을 할 때를 생각해 봅시다. (* 원래 iterator라는 건 0부터 시작하는 것이지만 편의상 여기서는 이산수학의 차원에서 1부터 시작하는 것으로 함)


    제일 쉬운 거부터 생각해 봅시다.

    세번째 숫자는 뭐가 될까요?

    i % 6 연산의 결과, 즉 i를 6으로 나눈 나머지가 세번째 숫자가 됩니다.

    i1일 때 111이 출력되잖아요. 1 % 6 = 1.


    두번째 숫자는 뭐가 될까요?

    i1~6일 때는 확실히 1입니다.

    i7일 때부터는 12x 형태이니까 두번째 숫자가 2가 됩니다.

    i12일 때까지 2가 되겠군요.

    i18이거나 그보다 작을 때는 3이 될 거구요.

    조금 생각해 봅니다.

    i6^1 = 6으로 나눈 다음, 소수점은 올림하고, 그걸 6으로 나눈 나머지가 두번째 숫자가 되겠네요.

    6^1이냐? 두번째 숫자가 공통되게 1인 경우는, 다른 건 다 같고 세번째 숫자만 6번 변하고 있는 경우이기 때문입니다.


    첫번째 숫자는 뭐가 될까요?

    i1~36일 때는 1xx 형태일 테니까 확실히 1입니다.

    i37~36*2일 때는 2xx 형태일 테니 아마 2일 겁니다.

    음 이제 슬슬 뭐가 어떻게 되어가는지 알 것 같군요.

    i6^2 = 36으로 나눈 다음, 소수점은 올림하고, 그걸 6으로 나눈 나머지가 첫번째 숫자가 되겠군요.


    6^2가 나왔으니 말인데, 혹시 4자리 수를 출력해야 하는 경우라면 그때의 첫번째 숫자는 뭐가 될까요?

    혹시 i6^3 = 216으로 나눈 다음, 소수점은 올림하고, 그걸 6으로 나눈 나머지... 일까요?

    그리고 그때에도 4번째 숫자는 i6으로 나눈 나머지이고...

    잠깐만, 혹시 그러면, 사실 주사위를 n번 던져서 나올 수 있는 모든 가짓수의 나열에서, m번째 숫자라는 건 사실은 i6^(n-m)으로 나누고, 소수점을 올림하고, 그걸 6으로 나눈 나머지였던 걸까요?! 앞에서 유도한 공식들을 지금 좀 다시 봤는데... 이거 맞는거 같은데? 질문자님 생각은 어때요?


    이상의 풀이는 지극히 수학적인 접근이며 공학이 1도 사용되지 않고 있습니다. 아마 출제자가 원한 것은 재귀적 접근이 맞을 것입니다. 문자열의 목록을 입력받아, 각 문자열 뒤에 1~6의 문자를 하나 더 붙인 결과들로 이루어진 문자열의 목록을 반환하는 함수가 핵심적으로 필요합니다. 하지만 지금 질문자님의 프로그래밍 이해 수준에서 이런 접근은 불가능합니다. 그냥 순순히 "선생님 저는 for를 이해했고 문제를 풀기 위한 방안을 다각도로 접근할 줄 압니다"까지만 어필하도록 합시다.

    행운을 빕니다. Wish your godspeed.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)