[해결] 정답코드 결과 출력 방법
- 경우의 수가 몇 개인지를 #으로 표현하겠다
- 만약, 경우의 수가 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 =>
```
nobinson20님의 답변
여기서 우리가 하고싶은 것을 한번 생각해봅시다.
저 2중 for loops에서 우리의 목표는 counts라는 배열 각각의 요소가 가지고 있는 숫자만큼 #을 출력하고 싶습니다.
그러기 위해서 배열을 2부터 12까지 세야하는 for문이 필요하고, 그 내부에 빈도수를 의미하는 해당 숫자만큼 출력하는 for문이 하나 더 필요합니다. 즉 pseudo code로 말하자면,
배열 counts 전체 요소들 중 i번째 요소에 대해
두 자리 정수의 형태로 i를 출력해라
counts의 i번째 숫자를 j라고 할때
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번 #을 출력합니다
...
이해가 되셨길 바라며 이해가 잘 가지않으시다면 얼마든지 다시 질문해주세요.
haesamq님의 답변
# 답변입니다
아래 결과를,
```
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();
}
```
wldudrhdwndi님의 답변
아~~ 이해됐습니다
감사합니다!!