로또 번호를 중복 없이 6개 뽑고,
오름차순으로 정렬된 형태로 출력한 뒤,
미리 정해둔 당첨 번호와 비교해서 등수를 판별하는 프로그램을 Dart로 구현했다.
그 과정에서 번호 중복 / 정렬 / 당첨 판별 로직에서 여러 번 코드를 고쳐나가며 문제를 해결했다.
요구사항
1~45 사이 랜덤 번호 6개 생성
번호는 중복되면 안 됨
정렬된 상태로 화면에 출력
내가 뽑은 번호 vs 당첨 번호의 교집합 개수에 따라 등수 출력
처음에는 “그냥 List에 랜덤 숫자 넣고 시작하면 되겠지” 정도로 가볍게 시작했다.
처음 시도는 이런 식이었다.
List myNumber = [ ];
while (myNumber.length < 6) {
int randomNum = Random().nextInt(45) + 1;
myNumber.add(randomNum);
}
print(myNumber);
문제 1: 중복 번호가 나옴
add만 쓰다 보니 같은 숫자가 여러 번 들어가는 문제가 생김.
문제 2: 정렬이 안 되어 있음
출력 시 [35, 2, 41, 9, ...] 이런 식으로 뒤죽박죽.
중복 문제를 해결하기 위해 자료구조를 List → Set으로 바꾸었다.
Set myNumber = {};
while (myNumber.length < 6) {
int randomNum = Random().nextInt(46); // 0~45
if (randomNum != 0) {
myNumber.add(randomNum);
}
}
print(myNumber);
장점
Set을 쓰면서 중복은 자동으로 제거됨.
계속되는 문제
출력 시 {9, 37, 2, 29, ...}처럼 순서가 보장되지 않음.
로또 번호는 사람 기준으로 봤을 때 오름차순이 훨씬 읽기 좋기 때문에, 다시 한 번 정리할 필요가 생김.
Set을 쓴 상태에서 정렬을 하려면 결국 다시 List로 변환해서 sort()를 해야 했다.
var sorted = myNumber.toList()..sort();
print(sorted);
이렇게 하면 되긴 하는데,
중복 제거용 Set + 정렬용 List” 구조라서 코드가 이중 구조처럼 느껴지고
정렬까지 고려한 더 좋은 자료구조가 없을까 고민이 생겼다.
여기서 잠깐 막혔다.
문제들을 한 번에 정리하기 위해 결국 SplayTreeSet를 도입했다.
import 'dart:collection';
import 'dart:math';
void main() {
var myNumber = SplayTreeSet();
int randomNum = 0;
while (myNumber.length < 6) {
randomNum = Random().nextInt(46);
if (randomNum != 0) {
myNumber.add(randomNum);
}
}
print("발급한 로또 번호 : ${myNumber.toList()}");
Set lottoNum = {9, 19, 29, 35, 37, 38};
print("당첨 번호 : ${lottoNum.toList()}");
Set intersection = myNumber.intersection(lottoNum);
if (intersection.length >= 5) {
print("당첨 여부 : [1등]! 맞춘 번호 : ${intersection.toList()}");
} else if (intersection.length >= 4) {
print("당첨 여부 : [2등]! 맞춘 번호 : ${intersection.toList()}");
} else if (intersection.length >= 3) {
print("당첨 여부 : [3등]! 맞춘 번호 : ${intersection.toList()}");
} else if (intersection.length >= 1) {
print("당첨 여부 : 당첨 실패! 맞춘 번호 : ${intersection.toList()}");
} else {
print("당첨 여부 : 당첨 실패! 맞춘 번호 : 꽝!!!");
}
}
여기서 한 번에 해결된 것들:
중복 제거
Set 특성 그대로라 중복은 자동 제거.
정렬 문제
SplayTreeSet 자체가 정렬을 유지하는 Set이라 별도의 sort()없이도 항상 오름차순.
당첨 번호 비교
intersection 사용해서 교집합을 구하고,
intersection.length 기반으로 등수 판별 로직을 정리.
지금 상태에서 해결된 점
중복 없는 로또 번호 6개 생성
자동 오름차순 정렬
당첨 번호와 교집합으로 등수 판별
사람이 보기 좋은 형태로 toList()를 붙여 출력 포맷까지 정리
앞으로 더 개선할 수 있는 부분
Random().nextInt(46) + if (randomNum != 0) 대신
Random().nextInt(45) + 1로 바꾸면 조건문 없이 더 깔끔하게 구현 가능.