[해결] 정답코드 결과 출력 방법

  • 경우의 수가 몇 개인지를 #으로 표현하겠다
  • 만약, 경우의 수가 5개면 => ##### 출력하겠음

  • 만약, i = 5 라면은
    => 주사위 두 개 합이 5인 경우의 수만큼 ( = counts[5] )
    => #을 출력

[질문] 정답코드 중, 결과 출력 부분

  1. for (int i = 2; i < counts.length; i++) {
  2. //참고 : %2d는 왼쪽 오른쪽 정렬을 의미하는 숫자임
  3. System.out.printf("%2d => ", i);

~ 여기부터 이해 x ~

  1. // 상위 for문에서 i를 반복시키고 있음
  2. // 하위 for문(여기)에서 counts[i] 값은 => 상위 for문의 영향을 받아서 i가 반복되는가? (뭔 상관이지??)
  3. // 여기 반복 돌려서 # 출력시키는게 => 위 경우의 수를 어떻게 나타내게 되는 거지? (이해 안 됨)
  4. for (int j = 0; j < counts[i]; j++) {
  5. System.out.print("#");
  6. }

주사위 통계

CODE Link

  1. import java.lang.Math;
  2. import java.util.Random;
  3. public class RandomTest {
  4. public static void main(String[] args) {
  5. // 배열 counts는 0~12칸을 가지고, 각 칸을 인단 모두 int값 0을 가짐 (기본 셋팅)
  6. int[] counts = new int[13];
  7. // 주사위 A, B 동시에 100회 던지기
  8. // 배열 counts는 0 ~ 12칸을 가짐
  9. // 만약 a가 1, b가 1의 값이 나오면 => 배열 counts의 [2] 칸의 값을 1 증가 (++)
  10. // 즉, counts[N]은 => N이 나오는 경우의 수를 나타냄
  11. for (int i = 0; i < 100; i++) {
  12. int a = DieA.roll();
  13. int b = DieB.roll();
  14. counts[a + b]++;
  15. }
  16. // 결과 출력 (내 맘대로 만든 결과임. 무시하기)
  17. // counts[2] ~ counts[12]
  18. // (출력 구조) 두 주사위 합이 2라는 값이 나오는 경우의 수 => counts[2]
  19. for (int i = 2; i < counts.length; i++) {
  20. System.out.printf("%d => %d\n", i, counts[i]);
  21. }
  22. // 결과 출력 (정답 코드)
  23. for (int i = 2; i < counts.length; i++) {
  24. System.out.printf("%2d => ", i);
  25. // 상위 for문에서 i를 반복시키고 있음
  26. // 하위 for문(여기)에서 counts[i] => i 반복 (뭔 상관이지??)
  27. // 여기 반복 돌려서 # 출력시키는게 => 위 경우의 수를 나타내는 건가?
  28. // 이해 안 됨
  29. for (int j = 0; j < counts[i]; j++) {
  30. System.out.print("#");
  31. }
  32. System.out.println();
  33. }
  34. }
  35. }
  36. // DieA, DieB 두 클래스 모두 1~6의 값 반환하는 클래스임
  37. // 다른 두 개의 방법으로 만들어본 거임 (쉬움)
  38. class DieA {
  39. public static int roll() {
  40. double r = Math.random() * 6;
  41. int randInt = (int) r;
  42. return randInt + 1;
  43. }
  44. }
  45. class DieB {
  46. public static int roll() {
  47. Random rand = new Random();
  48. int randInt = rand.nextInt(6);
  49. return randInt + 1;
  50. }
  51. }

INPUT

OUPUT

  1. 2 => 4
  2. 3 => 4
  3. 4 => 8
  4. 5 => 12
  5. 6 => 10
  6. 7 => 18
  7. 8 => 20
  8. 9 => 13
  9. 10 => 5
  10. 11 => 6
  11. 12 => 0
  12. 2 => ####
  13. 3 => ####
  14. 4 => ########
  15. 5 => ############
  16. 6 => ##########
  17. 7 => ##################
  18. 8 => ####################
  19. 9 => #############
  20. 10 => #####
  21. 11 => ######
  22. 12 =>

여기서 우리가 하고싶은 것을 한번 생각해봅시다.
저 2중 for loops에서 우리의 목표는 counts라는 배열 각각의 요소가 가지고 있는 숫자만큼 #을 출력하고 싶습니다.
그러기 위해서 배열을 2부터 12까지 세야하는 for문이 필요하고, 그 내부에 빈도수를 의미하는 해당 숫자만큼 출력하는 for문이 하나 더 필요합니다. 즉 pseudo code로 말하자면,

배열 counts 전체 요소들 중 i번째 요소에 대해
       두 자리 정수의 형태로 i를 출력해라
       counts의 i번째 숫자를 j라고 할때
             j만큼 #을 출력해라

실제 코드를 다시 보겠습니다.

  1. // i는 counts를 탐색하기 위해 해당 루프의 현재 위치를 표시한 값 (즉 인덱스값)입니다.
  2. for (int i = 2; i < counts.length; i++) {
  3. System.out.printf("%2d => ", i);
  4. // 아래 루프문에서 i는 자기 자신을 감싸고있는 상위 for문의 i와 같습니다.
  5. // 예를 들어, i = 2라면, 아래는 counts[2] 즉 주사위 2의 빈도수만큼 #을 출력합니다.
  6. for (int j = 0; j < counts[i]; j++) {
  7. System.out.print("#");
  8. }

다시 말해,
i = 2일 때, counts[i] = 4라면 j는 0부터 3까지 늘어나면서 4번 #을 출력합니다
i = 3일 때, counts[i] = 12라면 j는 0부터 11까지 늘어나면서 12번 #을 출력합니다
i = 4일 때, counts[i] = 7라면 j는 0부터 6까지 늘어나면서 7번 #을 출력합니다
i = 5일 때, counts[i] = 2라면 j는 0부터 1까지 늘어나면서 2번 #을 출력합니다

이해가 되셨길 바라며 이해가 잘 가지않으시다면 얼마든지 다시 질문해주세요.

답변입니다

아래 결과를,

  1. 2 => 4
  2. 3 => 4
  3. 4 => 8
  4. 5 => 12
  5. 6 => 10
  6. 7 => 18
  7. 8 => 20
  8. 9 => 13
  9. 10 => 5
  10. 11 => 6
  11. 12 => 0

요렇게 시각화 해봅시다. 어떻게 하면 좋을까요?

  1. 2 => ####
  2. 3 => ####
  3. 4 => ########
  4. 5 => ############
  5. 6 => ##########
  6. 7 => ##################
  7. 8 => ####################
  8. 9 => #############
  9. 10 => #####
  10. 11 => ######
  11. 12 =>

두 주사위의 합이 2인 경우의 횟수는 4번. 3인 경우 4번. 4인 경우, … 해서 12까지. 이를 샵(#) 문자를 통해 출력하면 되겠습니다.

  1. // i: 두 주사위의 합
  2. for (int i = 2; i <= 12; i++) {
  3. // j: 두 주사위의 합 i가 나온 횟수만큼 반복하기 위한 변수.
  4. for (int j = 0; j < counts[i]; j++) {
  5. System.out.print("#");
  6. }
  7. System.out.println();
  8. }

아~~ 이해됐습니다
감사합니다!!

[Markdown Preview]