[해결] 정답코드 결과 출력 방법 - 경우의 수가 몇 개인지를 #으로 표현하겠다 - 만약, 경우의 수가 5개면 => ##### 출력하겠음 - 만약, i = 5 라면은 => 주사위 두 개 합이 5인 경우의 수만큼 ( = counts[5] ) => #을 출력 [질문] 정답코드 중, 결과 출력 부분 for (int i = 2; i < counts.length; i++) { //참고 : %2d는 왼쪽 오른쪽 정렬을 의미하는 숫자임 System.out.printf("%2d => ", i); ~ 여기부터 이해 x ~ // 상위 for문에서 i를 반복시키고 있음 // 하위 for문(여기)에서 counts[i] 값은 => 상위 for문의 영향을 받아서 i가 반복되는가? (뭔 상관이지??) // 여기 반복 돌려서 # 출력시키는게 => 위 경우의 수를 어떻게 나타내게 되는 거지? (이해 안 됨) for (int j = 0; j < counts[i]; j++) { System.out.print("#"); } # 주사위 통계 #### CODE <a class='btn btn-default' href='/codes/23448'>Link</a> ``` import java.lang.Math; import java.util.Random; public class RandomTest { public static void main(String[] args) { // 배열 counts는 0~12칸을 가지고, 각 칸을 인단 모두 int값 0을 가짐 (기본 셋팅) int[] counts = new int[13]; // 주사위 A, B 동시에 100회 던지기 // 배열 counts는 0 ~ 12칸을 가짐 // 만약 a가 1, b가 1의 값이 나오면 => 배열 counts의 [2] 칸의 값을 1 증가 (++) // 즉, counts[N]은 => N이 나오는 경우의 수를 나타냄 for (int i = 0; i < 100; i++) { int a = DieA.roll(); int b = DieB.roll(); counts[a + b]++; } // 결과 출력 (내 맘대로 만든 결과임. 무시하기) // counts[2] ~ counts[12] // (출력 구조) 두 주사위 합이 2라는 값이 나오는 경우의 수 => counts[2] for (int i = 2; i < counts.length; i++) { System.out.printf("%d => %d\n", i, counts[i]); } // 결과 출력 (정답 코드) for (int i = 2; i < counts.length; i++) { System.out.printf("%2d => ", i); // 상위 for문에서 i를 반복시키고 있음 // 하위 for문(여기)에서 counts[i] => i 반복 (뭔 상관이지??) // 여기 반복 돌려서 # 출력시키는게 => 위 경우의 수를 나타내는 건가? // 이해 안 됨 for (int j = 0; j < counts[i]; j++) { System.out.print("#"); } System.out.println(); } } } // DieA, DieB 두 클래스 모두 1~6의 값 반환하는 클래스임 // 다른 두 개의 방법으로 만들어본 거임 (쉬움) class DieA { public static int roll() { double r = Math.random() * 6; int randInt = (int) r; return randInt + 1; } } class DieB { public static int roll() { Random rand = new Random(); int randInt = rand.nextInt(6); return randInt + 1; } } ``` #### INPUT ``` ``` #### OUPUT ``` 2 => 4 3 => 4 4 => 8 5 => 12 6 => 10 7 => 18 8 => 20 9 => 13 10 => 5 11 => 6 12 => 0 2 => #### 3 => #### 4 => ######## 5 => ############ 6 => ########## 7 => ################## 8 => #################### 9 => ############# 10 => ##### 11 => ###### 12 => ```
여기서 우리가 하고싶은 것을 한번 생각해봅시다. 저 2중 for loops에서 우리의 목표는 counts라는 배열 각각의 요소가 가지고 있는 숫자만큼 #을 출력하고 싶습니다. 그러기 위해서 배열을 2부터 12까지 세야하는 for문이 필요하고, 그 내부에 빈도수를 의미하는 해당 숫자만큼 출력하는 for문이 하나 더 필요합니다. 즉 pseudo code로 말하자면, 배열 counts 전체 요소들 중 i번째 요소에 대해 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 두 자리 정수의 형태로 i를 출력해라 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; counts의 i번째 숫자를 j라고 할때 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j만큼 #을 출력해라 실제 코드를 다시 보겠습니다. ```java // i는 counts를 탐색하기 위해 해당 루프의 현재 위치를 표시한 값 (즉 인덱스값)입니다. for (int i = 2; i < counts.length; i++) { System.out.printf("%2d => ", i); // 아래 루프문에서 i는 자기 자신을 감싸고있는 상위 for문의 i와 같습니다. // 예를 들어, i = 2라면, 아래는 counts[2] 즉 주사위 2의 빈도수만큼 #을 출력합니다. for (int j = 0; j < counts[i]; j++) { System.out.print("#"); } ``` 다시 말해, 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번 #을 출력합니다 ... 이해가 되셨길 바라며 이해가 잘 가지않으시다면 얼마든지 다시 질문해주세요.
# 답변입니다 아래 결과를, ``` 2 => 4번 3 => 4번 4 => 8번 5 => 12번 6 => 10번 7 => 18번 8 => 20번 9 => 13번 10 => 5번 11 => 6번 12 => 0번 ``` 요렇게 시각화 해봅시다. 어떻게 하면 좋을까요? ``` 2 => #### 3 => #### 4 => ######## 5 => ############ 6 => ########## 7 => ################## 8 => #################### 9 => ############# 10 => ##### 11 => ###### 12 => ``` 두 주사위의 합이 2인 경우의 횟수는 4번. 3인 경우 4번. 4인 경우, ... 해서 12까지. 이를 샵(#) 문자를 통해 출력하면 되겠습니다. ``` // i: 두 주사위의 합 for (int i = 2; i <= 12; i++) { // j: 두 주사위의 합 i가 나온 횟수만큼 반복하기 위한 변수. for (int j = 0; j < counts[i]; j++) { System.out.print("#"); } System.out.println(); } ```
아~~ 이해됐습니다 감사합니다!!