[내배캠 앱창업] Day 9 - 트러블슈팅

쏘쏠·2025년 12월 4일

1. 개요

로또 번호를 중복 없이 6개 뽑고,

오름차순으로 정렬된 형태로 출력한 뒤,

미리 정해둔 당첨 번호와 비교해서 등수를 판별하는 프로그램을 Dart로 구현했다.

그 과정에서 번호 중복 / 정렬 / 당첨 판별 로직에서 여러 번 코드를 고쳐나가며 문제를 해결했다.

2. 트러블슈팅

2-1. 배경

요구사항

1~45 사이 랜덤 번호 6개 생성

번호는 중복되면 안 됨

정렬된 상태로 화면에 출력

내가 뽑은 번호 vs 당첨 번호의 교집합 개수에 따라 등수 출력

처음에는 “그냥 List에 랜덤 숫자 넣고 시작하면 되겠지” 정도로 가볍게 시작했다.

2-2. 발단 – 중복 & 정렬 문제 발견

처음 시도는 이런 식이었다.

List myNumber = [ ];
while (myNumber.length < 6) {
int randomNum = Random().nextInt(45) + 1;
myNumber.add(randomNum);
}
print(myNumber);

문제 1: 중복 번호가 나옴

add만 쓰다 보니 같은 숫자가 여러 번 들어가는 문제가 생김.

문제 2: 정렬이 안 되어 있음

출력 시 [35, 2, 41, 9, ...] 이런 식으로 뒤죽박죽.

2-3. 전개 – Set으로 갈아타기

중복 문제를 해결하기 위해 자료구조를 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, ...}처럼 순서가 보장되지 않음.

로또 번호는 사람 기준으로 봤을 때 오름차순이 훨씬 읽기 좋기 때문에, 다시 한 번 정리할 필요가 생김.

2-4. 위기 – 정렬 + 출력 포맷 고민

Set을 쓴 상태에서 정렬을 하려면 결국 다시 List로 변환해서 sort()를 해야 했다.

var sorted = myNumber.toList()..sort();

print(sorted);

이렇게 하면 되긴 하는데,

중복 제거용 Set + 정렬용 List” 구조라서 코드가 이중 구조처럼 느껴지고

정렬까지 고려한 더 좋은 자료구조가 없을까 고민이 생겼다.

여기서 잠깐 막혔다.

2-5. 절정 – SplayTreeSet + 교집합(intersection) 도입

문제들을 한 번에 정리하기 위해 결국 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 기반으로 등수 판별 로직을 정리.

2-6. 결말 – 현재 상태 & 앞으로의 개선 포인트

지금 상태에서 해결된 점

중복 없는 로또 번호 6개 생성

자동 오름차순 정렬

당첨 번호와 교집합으로 등수 판별

사람이 보기 좋은 형태로 toList()를 붙여 출력 포맷까지 정리

앞으로 더 개선할 수 있는 부분

Random().nextInt(46) + if (randomNum != 0) 대신
Random().nextInt(45) + 1로 바꾸면 조건문 없이 더 깔끔하게 구현 가능.

profile
Flutter 앱창업 일기장

0개의 댓글