배열을 만들고 이 배열의 길이만큼 임의의 수를 넣으려고 합니다.
로또처럼 1~45 사이의 수로 하려면 이렇게 하세요. Math.random()을 활용하되 0.0~0.99999... 까지밖에 안되는 값에 최대값을 곱해서 0~44.99999... 로 만들어주세요. 여기에 1을 더해 1~45.99999로 만들고 int형으로 변환하면 1~45까지의 임의의 수가 나옵니다.
로또에는 같은 숫자가 다시 뽑혀나오지 않으므로 직접 중복여부를 검사해서 중복인 경우 해당 칸을 다시 반복하도록 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
int[] numbers = new int[6]; // 6개의 정수를 담는 배열 선언
// insertCur가 numbers 배열의 길이를 넘지 않을 때까지 반복합니다.
// 중복이 생긴다면 반복 횟수가 늘어날 수 있습니다.
for(int insertCur = 0; insertCur < numbers.length ; insertCur++){
// 1. 임의의 수 삽입
// Math.random()이 제공하는 0.0~0.999...의 수에 45를 곱해
// 0.0~44.xx의 수를 만들고 이를 정수로 바꾼다.
// 여기에 1을 더해서 1~45가 되도록 한다.
numbers[insertCur] = (int)(Math.random() * 45) + 1;
// 2. 중복 검사
// 배열의 기존 원소(insertCur 이전까지)를
// 방금 삽입한 수와 비교해 같은 수가 있다면 insertCur를 앞으로 밀어
// 다음 반복에서 같은 칸에 다른 수를 쓰도록 합니다.
for(int searchCur = 0; searchCur < insertCur; searchCur ++){
if(numbers[insertCur] == numbers[searchCur]){
insertCur--; // insertCur를 앞으로 민다
break; // 다음 것을 검색할 필요가 없으므로 중복검사 반복을 나갑니다.
}
}
}
// 3. 출력하기
System.out.println("행운의 번호는 아래와 같습니다:");
for(int i = 0; i < numbers.length; i ++){
if(i > 0){
// 맨 처음 원소가 아니라면 앞에 ", "문자열 추가
// 1, 2, 3, ..., 6 꼴로 나오게 함
System.out.print(", ");
}
System.out.print(numbers[i]);
}
|
결과
더 쉽게 코딩하고 싶다면
HashSet을 활용해보세요. HashSet은 같은 값은 하나씩만 담기므로(중복이 허용되지 않음) 계속 값을 담으며 전체적으로 몇 개가 담겼는지만 확인하시면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
// Integer 정수 객체를 담는 HashSet
// HashSet은 중복을 거부하는 Set 입니다.
// 중복이 들어오면 이는 무시되어 같은 수는 하나만 담기게 됩니다.
HashSet<integer> luckyNumbers = new HashSet<>();
// 이 HashSet에 수가 6개 채워질 때 까지 반복합니다.
// 중복 처리가 자동으로 이루어지므로 삽입만 하면 됩니다.
// 하지만 중복된 수는 삽입이 거부되므로 반복 횟수가 늘어날 수 있습니다.
while(luckyNumbers.size() < 6){
// 1. 임의의 수 삽입
// Math.random()이 제공하는 0.0~0.999...의 수에 45를 곱해
// 0.0~44.xx의 수를 만들고 이를 정수로 바꾼다.
// 여기에 1을 더해서 1~45가 되도록 한다.
luckyNumbers.add((int)(Math.random() * 45) + 1);
}
// 2. 출력하기
System.out.println("행운의 번호는 아래와 같습니다:");
boolean isFirstNum = true; // 맨 처음에 기재되는 번호인지를 파악하는 플래그
// luckyNumbers 각 원소를 읽기전용으로 하나씩 꺼내기
for(int luckyNum : luckyNumbers){
if(isFirstNum){
isFirstNum = false; // 맨 처음에는 ", " 문자열을 추가하지 않고 플래그를 내립니다.
} else {
// 맨 처음 원소가 아니므로 앞에 ", "문자열 추가
// 1, 2, 3, ..., 6 꼴로 나오게 함
System.out.print(", ");
}
System.out.print(luckyNum);
}
|
[람다] 문자열 두개 받아서 비교하는거 (0) | 2023.04.04 |
---|---|
[스트림] 꼭 외우기. 배열에서 가장 긴 문자를 리턴 (0) | 2023.03.31 |
소수찾기 알고리즘 (0) | 2023.03.30 |
[제네릭] 외우기2 (0) | 2023.03.30 |
[제네릭] 외우기 (0) | 2023.03.28 |
댓글 영역