프로그래밍 언어/Java

[JAVA] 랜덤 숫자 중복제거 쉽게 이해하기!

반응형

자바 초보분들이 많이 하시는 프로젝트인 숫자 맞추기, 야구게임, 로또 프로그램 등을 완성시키기 위해서 중복 숫자 값이 나오지 않도록 구현을 하실 텐데, 중복 숫자를 제거하기 위해 한 가지 쉬운 방법을 알려드리겠습니다.

public class RandomNum {
    public static void main(String[] args) {
        int rNum[] = new int[9];
        boolean room[] = new boolean[9];

        int index = 0;
        int rnd;

        while(index < 9){
            rnd = (int)(Math.random()*9);
            if(!room[rnd]){
                room[rnd] = true;
                rNum[index] = rnd + 1;
                index++;
            }
        }


        for(int i=0; i<rNum.length; i++){
            System.out.print(rNum[i]+"\t");
                if((i+1)%3 == 0){
                    System.out.println();
                }
            }
    }
}


/* result
5	8	4	
1	3	2	
6	7	9	
*/

 위 코드는 [1~45의 숫자] 중 중복 없이 30개의 숫자를 뽑아서 출력하는 프로그램입니다.
즉, 중복 숫자가 나오지 않는 로또 프로그램을 5회 연속 실행하는 프로그램이라고 생각하시면 될 것 같습니다.

rNum = 필요한 숫자의 개수
room = 숫자의 범위 
예를 들어서, 야구게임이라고 가정했을 때는 int rNum [] = new int [3], boolean room [] = new boolean[9] 로 해주시면 되겠죠? 
boolean room[] = new boolean [9]의 경우 선언을 하고, boolean 초기화를 안 해주는 경우 기본적으로 false값이 들어가게 됩니다.

room[0] room[1] room[2] room[3] room[4] room[5] room[6] room[7] room[8] room[9]
false false false false false false false false false false

만약, room = 방 이름 [0] = 객실번호라고 합시다!
현재는 모든 문이 false(=close) 닫혀있으므로, 손님이 들어가지 않은 상태입니다.

당연히 손님이 없는 빈 객실에만 손님이 들어갈 수 있겠죠? 조건문을 사용합니다. 
if(! room [rnd])

첫 번째 손님은 5번 손님이네요.  room [5]은 5번 손님이 들어갈수 있도록 방문을 열어줍니다.
room[5] = true

room[0] room[1] room[2] room[3] room[4] room[5] room[6] room[7] room[8] room[9]
false false false false false true false false false false



이런 식으로 필요한 숫자의 개수만큼 boolean형 배열을 만들어서 숫자를 뽑아내서 true로 변경하여 중복 숫자가 나오지 않도록 순서대로 rNum에 값을 넣어주면 됩니다. 

정리
1. 필요한 숫자의 개수(rNum)만큼 boolean형 배열 선언
2. 랜덤 숫자(rnd)를 뽑고 boolean [rnd] = false 일 때만
3. 랜덤 숫자(rnd)의 값을 필요한 숫자의 배열(rNum)에 순차적으로 넣어준다.

 

반응형