-
(국비교육) 7 - 랜덤 + 2차원 배열 + 로또뽑기 + N자 그리기 + 중복값 제거개발/국비교육 2023. 6. 9. 17:50
■ 지난 학습 복습
* 주소값 출력
System.out.println(arr01);
* 번지에 저장된 값 출력
System.out.println(arr01[0]);
■ 사용자가 점수 입력하면 배열에 넣고 출력하기
사용자가 입력한 점수를 입력하면 가져오게끔 하기 위해서는
Scanner 를 통해 입력값을 설정할 수 있게 만들어준다.
배열의 마지막까지 반복하기 위해서는 arr01.length 보다 작은 수로 설정한다.
sc.nextlnt() 를 통해 input 값을 입력받고, 입력값을 arr01[ i ] 로 설정해서 반복하여 저장한다.
입력한 값의 배열 전체를 출력하기 위해서는 Arrays.toString() 을 이용한다.
각 배열의 값을 구하기 위해서는 System.out.println( arr01[ i ] ); 으로 각 배열의 값을 출력할 수 있다.
※ import : 가져오기
* forEach 향상문
forEach 향상문은 요소와 집합으로 이루어져있는데, 코드는 아래와 같다.
for (int i : arr01) {System.out.println(i);
}
(요소 : 집합) 모양으로 이루어져있으며 집합을 구성하는 요소를 하나씩 반환하게 된다.
즉, arr01 집합에서 int i 의 요소를 출력하게 되면,
for 반복문보다는 보다 간결하게 반복문을 실행할 수 있다.
■ 랜덤으로 로또 뽑기 (1~45 숫자에서 6개 뽑기)
자바의 랜덤(난수)로 로또 뽑기 진행을 위해서는 로또 번호 설정이 필요하다.
로또는 1 부터 45 까지의 숫자로 이루어지고 6개의 숫자를 뽑기 때문에 이에 대한 설정이 필요하다.
먼저 6개의 숫자배열을 뽑기 때문에 배열을
int[ ] lotto = new int[ 6 ]; 으로 선언해준다.
이제 랜덤으로 뽑을 수 있게 설정해줘야 하는데 여기서 쓰이는 것이 Math.random() 이다.
각 배열마다 랜덤값을 배정할 것으로 배열값을 i 로 설정하고, 각 배열마다 Math.random() 을 사용하여 랜덤값을 부여한다.
lotto[ i ] = ((int) ((Math.random() * 45) + 1));
여기서 랜덤 값에 * 45를 하면 0 ~ 44까지 나온다.
우리는 1부터 나오게끔 설정하기 때문에 +1 을 해주면 1 ~ 45 까지의 값을 구할 수 있다.
Math.random()은 double 형으로 int 로 캐스트 처리를 해주면 된다.
이렇게 하고 출력하게 되면 랜덤으로 로또 번호를 1부터 45까지 출력할 수 있다.
* 로또 중복값 없애기
하지만 위와 같이 코딩을 하면 로또에 중복값이 발생하게 된다.
따라서 중복값을 없애주는 작업이 필요하다.
이를 for 문을 통해 조건을 걸어준다.
lotto 두 번째 값이 첫 번째 값이랑 같게 되면 다시 랜덤으로 돌려주는 조건을 걸고, 이를 반복해야 한다.
따라서 lotto[ i ] == lotto[ j ] 로 설정하되,
랜덤값이 lotto[ 1 ] == lotto [ 0 ] 부터 돌게 설정하면 된다.
for (int j = 0; j < i; j++) {
if (lotto[ i ] == lotto[ j ]) {
i--;
break;
}}
즉 j 는 0부터 시작하되, i 가 1부터일때 비교하면 되므로 j < i 로 설정하고 증감시켜 준다.
만약 둘의 값이 같다면 다시 랜덤값을 돌려줘야 함으로 i값은 감소시켜 주고 for 문을 빠져나간다.
* 1 ~ 25 까지 중 1개 뽑기
1에서 25까지 랜덤으로 뽑는 방법도 위와 동일하게 배열을 i 로 설정하고,
Math.random() * 25 를 통해 0 ~ 24 중 1부터 시작함을 +1을 통해 1 ~ 25까지 나올 수 있도록 설정하고 출력한다.
■ 2차원 배열
- 2차원 배열은 배열 속에 배열이 있다.
- 2차원 배열은 값을 알기 위해서는 [ ][ ] 로 해야한다.
- 2차원 배열의 설정은
자료형[ ][ ] 변수 = new 자료형[크기][크기] ;
2차원 배열은 집과 방번호라고 생각하면 이해하기 쉽다.
arr[ 0 ] [ 0 ] = 100;
집 방번호
int[ ][ ] arr02 = new int[ 5 ][ 5 ]; 값에서 마지막 집과 방번호를 구한다면
arr02[ 4 ][ 4 ] 가 마지막이다.
index 2, index 마지막 방에 55를 저장하기
arr02[ 2 ][ 4 ] = 55;
* 2중 포문으로 모든 값 저장하기 (옆으로 찍어주기)
arr02 2차원 배열을 반복문을 통해 출력하면
배열의 각 집과 방번호에 해당하는 곳이 반복될 수 있도록 이중 for 문으로 설정해준다.
5개를 찍고 다시 돌리기 위해서는 j 에 해당하는 for 문이 끝나면 엔터에 해당하는
System.out.println(""); 를 통해 5개씩 출력 가능하다.
2열 3행에 해당하는 arr03도 반복문을 통해 동일하게 출력 가능하다.
arr03.length 는 arr03 의 집번호 2가 출력된다.
arr03[ 0 ].length 는 arr03 의 0번째 집의 방이 몇 개 있는지를 물어보는 것이므로 3이 나온다.
마찬가지로 arr03[ 0 ] 을 temp 로 저장하고 temp.length 를 하면 3이 나온다.
int[ ][ ] arr04 = new int[ 3 ][ 4 ]; 를 반복문을 통해 출력하고자 한다면,
for (int i = 0; i < arr04.length; i++) {
for (int j = 0; j < arr04[ i ].length; j++) {System.out.print(arr04[ i ][ j ] + " ");
}
System.out.println("");}
여기서 j 포문에 arr04[ i ].length 를 하는 이유는 j 는 방번호에 해당하므로
arr04[ i ] 집번호에 있는 방번호의 길이를 찾아야 하기 때문이다.
■ 1 ~ 25 까지 5 x 5 정수타입 배열 출력하기
먼저 5 x 5 배열을 선언해준다.
int[ ][ ] arr01 = new int[ 5 ][ 5 ];
배열의 집과 방번호의 반복이 필요하니 이중 for 문을 사용하여 i 와 j 로 설정해준다.
여기서 우리는 1부터 시작해야 함으로 num = 1 이라는 변수를 선언해주고,
이를 점차 증감시키도록 설정해준다.
int num = 1;
for (int i = 0; i < arr01.length; i++) {
for (int j = 0; j < arr01[ i ].length; j++) {
arr01[ i ][ j ] = num++;System.out.print(arr01[ i ][ j ] + " ");
}
System.out.println("");}
우리는 위의 for 문을 for each 로도 구할 수 있다.
집합 arr01 을 보니 그 안에 배열이 int 타입으로 보이는 배열 is 가 있고,
배열집합 is 를 i 요소로 열 수 있다.
이를 출력하면 위와 동일한 값을 얻을 수 있다.
int[ ] t = { 10, 12, 13, 14, 15}
to.string 은 1차열 배열만 찍으며 객체를 문자로 표현하는 메소드이다.
■ 홀수를 입력 받았을 때 n으로 n 자 그리기 ( Multiarray04 참고)
* 7 홀수를 받았을 때 n 그리기
홀수 7을 입력받았을 때 배열을 만들면
int[ ][ ] arr01 = new int[ 7 ][ 7 ]; 으로 나타낼 수 있다.
[1,0,0,0,0,0,1] 00 06
[1,0,0,0,0,0,1] 10 16
[1,0,0,0,0,0,1] 20 26
[1,0,0,0,0,0,1] 30 36
[1,0,0,0,0,0,1] 40 46
[1,0,0,0,0,0,1] 50 56
[1,0,0,0,0,0,1] 60 76자리로 먼저 생각했을 때, 앞의 열이 반복되고 행은 0으로 고정
앞의 열이 반복되고 행은 6으로 고정됐을 때 채워주면 된다.
이중 포문을 사용하여 식으로 나타내면 다음과 같다.
arr01[ i ][ 0 ] = 1;
arr01[ j ][ 6 ] = 1;또한 대각선이 채워지는 방식을 보면 행과 열의 숫자가 같을 때 채워진다.
즉, i = j 값이 같으면 배열에 1을 넣어주는 식으로 코드를 짠다.
if ( i == j ) {
arr01[ i ][ j ] = 1;
}* 에러해결 (1이 한번씩 더 찍혀서 밀리는 경우)
출력문을 양옆 1로 채울때도 적고, if 조건문 다음에도 적게 되면 1이 한번씩 더 적히는 오류가 발생한다.
따라서 최종적으로 if 까지 돌고 난 후 출력문이 나올 수 있도록 뒤에 설정해준다.
* 혼자 코딩실습 ( 7 홀수를 받았을 때 n 그리기)
해당 코딩을 if 조건으로 한 번에 설정하고 출력할 수도 있다.
* 홀수를 입력받고 n 그리기
먼저 입력값을 받기 위해서 Scanner 를 불러온다.
입력값을 num으로 저장하고, 저장받은 정수값으로 집번호와 방번호를 만든다.
입력받은 값으로 이중 for 문을 통해 채워지도록 한다.
조건으로 가장자리와 i 와 j 값이 같을 때 N 으로 채워져야 함으로
열 i 와 행 j 의 값이 같거나 행값 j 가 0 이거나 j 가 방번호 길이보다 -1 인 값인 경우 N으로 채워준다.
만약 그렇지 않은 경우는 공백으로 설정한다.
출력의 경우 2가지로 출력 가능하다
이중 for 문을 사용하거나 for each 를 통해 간단하게 나타낼 수도 있다.
■ 3 X 3 중복없이 1 ~ 9 넣기 (Test03)
먼저 2차원 배열 [ 3 ][ 3 ] 을 만들어준다.
배열에 들어갈 변수를 r1, r2 로 각각 선언해주고
마지막 집번호와 방번호가 2까지 이므로 r1 과 r2 를 Math.random() * 3 을 통해 표현해준다.
초기 정수 배열의 값은 0 임으로 만약 0일 경우에는 r1과 r2에 i 반복값을 넣어주고,
그렇지 않을 경우에는 이미 숫자가 들어가 있는 경우이기 때문에 다른 배열에 숫자가 들어갈 수 있도록 설정해준다.
설정이 완료 되었다면 2중문 혹은 for each 구문을 통해 출력할 수 있다.
java]삽질코드 3x3배열에 1~9숫자 무작.. : 네이버블로그 (naver.com)
'개발 > 국비교육' 카테고리의 다른 글
(국비교육) 9 - 패턴 + 아스키 코드 시계 + switch + 동적 가변 배열 + 배열복사 (2) 2023.06.13 (국비교육) 8 - 알고리즘 + 제어문 + do while + 숫자 랜덤뽑기 + 로또 (0) 2023.06.12 (국비교육) 6 - 구구단 출력하기 + %활용문 + 배열 (0) 2023.06.08 (국비교육) 5 - 메소드 호출 + if, for 문 + 별찍기 + 10진법 2진법 나타내기 (0) 2023.06.07 (국비교육) 4 - 자바 연산자 + 조건문과 반복문 + 2의 배수 만들기 + Fizz Buzz + 논리연산자 + 비트연산자 + 제어문 (0) 2023.06.05