[Java] 자바로 로또 번호 생성하기
- Language/Java
- 2020. 11. 26.
로또(Lotto)는 1부터 45까지의 숫자로 이루어진 값들 중 6개를 맞히는 복권이다. 즉 로또 번호를 생성한다는 것은 6번의 숫자를 생성해야 하며 이 숫자는 1부터 45까지 사이의 범위로 되어 있어야 하고, 각각의 값들은 서로 중복이 되면 안된다.
간혹 로또 번호를 생성한다는 알고리즘을 보여주면서, 중복이 될 수 있는 구조로 짠 알고리즘들을 보여주는데 이는 정확한 로또 번호 생성기라 말하기 어렵다.
로또 번호 생성이야 만드는 방법이 수십, 수백가지는 되겠지만 아래는 그냥 필자가 생각한 로또 번호 생성 알고리즘이다.
로또 번호 생성기
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class main {
public static void main(String[] args) {
// 로또값을 저장하는 맵 구조상 중복을 방지한다.
Map<String, String> lottoMap = new HashMap<String, String> ();
// 랜덤을 루프 밖에 지정
Random rd = new Random();
while(true) {
// 랜덤을 사용하고 값은 1부터 45까지의 사이이다.
int lottoNo = rd.nextInt(45)+1;
// 나온 결과를 맵에 담는다.
lottoMap.put(String.valueOf(lottoNo), "");
// 맵에 담을 경우 중복이면 기존 것을 업데이트하여 저장하기 때문에 별도의 처리를 할 필요가 없다.
// 맵의 값이 6개가 넘어가면 break로 루프를 종료
if(lottoMap.size() >= 6)
break;
}
// 로또맵에 저장된 키를 호출한다.
for(String lottoNo : lottoMap.keySet()) {
System.out.println(lottoNo);
}
}
}
자세한 설명은 주석에 달았지만, 다시 한번 설명하자면 아래와 같은 순서로 돌아간다.
- 로또값을 담은 lottoMap을 생성한다.
- 랜덤 객체를 루프 시작전에 생성한다.
- 랜덤값으로 1부터 45 사이의 정수를 lottoNo에 담는다
- lottoNo를 맵에 담는다. 이때 정수 값을 String.valueOf로 변환하여 담는다.
- 맵은 중복값이 들어올 경우 업데이트를 하기 때문에 별도의 중복처리를 할 필요가 없어서 해당 값이 6이 될 경우 break를 한다. ==로 만들어도 상관이 없지만, 6이상일 경우로 처리를 했으며 이는 원치않는 결과(ex: 무한루프)를 방지하기 위함이다.
- 맵에 저장된 키(로또 번호)를 불러들여서 화면에 출력한다.
간단한 프로그램을 하나 만들때에도 올바른 설계와 그게 맞게 코딩하는 습관이 중요하다. 간단한 로또 프로그램을 짜더라도 로또의 개념에 맞게 짜도록 한다. 위의 로직은 Map으로 했지만, Set으로 해도 동일한 결과가 나오니, 본인의 취향대로 골라서 작성하도록 한다.
소스가 더 간단하고, 로직이 견고한 방식인 셔플(Shffle)로 로또번호를 생성하길 원하면 아래의 링크로 만들어보도록 한다.
2022.01.16 - [Language/Java] - [Java] 리스트 섞기(Shuffle), 로또 번호 생성
반응형
'Language > Java' 카테고리의 다른 글
[Java] 자바 랜덤함수(Random) 및 Seed 설명 (0) | 2020.12.08 |
---|---|
[Java] 자바로 지정한 폴더 및 하위 폴더 탐색(재귀적 함수) (0) | 2020.11.29 |
[Java] 자바 날짜 포맷 변경법(SimpleDateFormat) (0) | 2020.11.26 |
[Java] 문자열 인코딩/디코딩 하기 (0) | 2020.11.17 |
[Java] Yaml, Yml 사용하기 (0) | 2020.11.16 |