사실 과제 때문에 만들게 된 것이지만, 다 하고 보니 과세 프로그램보다 더 어렵게 해결을 했던 것 같아서 기록으로 남겨보고자 한다.
그건 어쩌면 이 프로그램 만들기가 성장에 도움을 꽤나 주었던 것일지도...?
그래서 다음 과제가 비교적 쉬웠다고 느껴졌을 지도 모르겠다.
아무튼 이 로또 프로그램의 조건은 이러하다.
- scanner를 통해 내가 입력한 수만큼 (1~10까지) 랜덤 로또번호를 생성할 것.
(6개를 입력했다면 6개의 번호가 6쌍으로..)- 당첨 번호 또한 생성할 것.
- 나의 번호와 당첨 번호를 비교하여 일치하는 수가 몇개인지 출력할 것.
원래는 이 과제를 이차원 배열로 해결하려고 했었다.
그리고 이차원 배열로 어떻게 당첨 번호 뽑는 것 까지는 진행을 했었는데 ㅋㅋㅋ
그 번호를 뽑는 와중에 중복을 제거하고 오름차순으로 나열하려니 코드가 너무 복잡해지더라....
for문 안에 for문이 두개나 더 들어가니까 엄청 헷갈렸다.......
하다가 뇌정지 온건 안비밀....
과세 프로그램은 하루 정도 걸려 했는데....
이 이차원 배열로 골머리를 썩히느라...로또 프로그램은 3일걸린 듯....ㅋㅋㅋㅋㅋ
그래서 이차원 배열은 버리기로 했다.
그리고 그 다음으로 생각한게 HashSet이었는데 ㅋㅋㅋㅋ
중복만 제거하는거 사라지면 좀 편할 거라고 생각했다...하지만..........ㅋㅋㅋ
오름차순이가 나를 잡았다....ㅠㅠ따로 또 넣기 복잡해지고 싫어서 다른 방법 없나 궁리함...
그런데 같이 공부하시는 분이 TreeSet쓰면 자동으로 오름차순으로 정리 된다는 것을 알려주셨다...
여기까지.. TreeSet으로 오게 된 여정이다..
그래..그럼 TreeSet으로 한번 해보자.
그 전에 HashSet으로 한건 그나마 나았음.
왜냐면 이차원 배열로 한거는 그냥 코드 다 지워야 했지만 그래도 같은 Set 계열이라 그런가?
그냥 HashSet을 TreeSet으로 변경만 해줘도 됐기에...
TreeSet알려줘서 감사합니다....덕분에 고생을 덜었습니다...(feat. 줄진 재생)
근데 당첨 번호 뽑는 곳에서는 그냥 한쌍밖에 없겠다 for문으로 돌림.
결론: TreeSet도 쓰고 for문도 쓰고 했다~
요약해서 말을 하자면
TreeSet의 특징
1. Random으로 돌렸을 때 중복을 제거하여 산출
2. 오름차순 정리
3. 여러개의 element저장 가능
4. 그리고 그 여러개의 element에 배열을 저장가능! (어쨋든 자기도 ArrayList부류다 이거지....)
그렇게 TreeSet으로 방향을 잡고 시작했다.
뭔가 구구절절 좔좔하게 쓴 것 같은데 그것은 이것을 보는 사람들의 뇌를 편안하게 하기 위해서다...
완전 진심임 ㅎㅎ
import java.util.*;
public class main(String[] args){
public static void main {
Scanner sc = new Scanner(System.in);
Random rdm = new Random();
ArrayList<TreeSet> bundle = new ArrayList<>();
char[] myLottery = {A, B, C, D, E, F, G, H, I, J}
}
}
일단 이렇게 초반부를 들어가겠다. 필요한 스캐너, 랜덤, 배열을 저장할 bundle변수,
내 로또 한장한장을 구분지어줄 A, B, C.....
System.out.println("[로또 당첨 프로그램]");
System.out.print("구매 개수를 입력해 주세요.(1~10): ");
int many = sc.nextInt();
while(0 > many && many > 10){
System.out.print("다시 입력해 주세요.")
many = sc.nextInt();
}
//여기까지는 잘못된 수를 입력했을 때 다시 돌아가게끔 While을 써준 내용이다.//
//본격 내 로또 뽑기!!
for (int i = 0; i < many; i++) {
TreeSet<Integer> number = new TreeSet<>();
while (number.size()<6){
number.add(rdm.nextInt(45)+1);
}
bundle.add(number);
}
for (int i = 0; i < many; i++) {
System.out.print(myLottery[i]);
System.out.println(bundle.get(i));
}
System.out.println();
본격 로또 뽑기 아래 내용을 보자.
for문으로 i가 돌아갈 때마다 number라는 TreeSet이 선언되고, 그 아래 while을 넣어 이 변수에 6개의 번호를 입력하는 모습이다.
여기까진 오케이,,,,그런데 첨엔 이 랜덤으로 나온 수를 어떻게 저장하는지를 몰라서 이것 또한 학우분의 도움을 받음.....ㅋ 아직 메서드를 쓰는걸 잘 몰라서 그런거 같다.
근데 왜 ArrayList는 .add고 map은 .put이고,,,StringBuffer는 .append 로 하는거냐....
add로 통일 시켜주면 안댐?
ㅋㅋㅋㅋㅋ
아무튼 그렇게 for문을 완전히 빠져나오기 전에 앞서 만든 number(ArrayList)에 저장을 해줬다.
그리고 일단 출력!!
으음 아주 좋다. 앞에 로또마다 이름 넣어주려고 다시 for문 써서 i번째 myLottery인덱스, bundle 인덱스를 뽑아주었다.
그리고 이제....for문을 돌려서 당첨 번호를 뽑아보자!
System.out.println("[로또 발표]");
int[] lotto = new int[6];
for (int i = 0; i < 6; i++) {
lotto[i] = rdm.nextInt(45) + 1;
for (int j = 0; j < i; j++) {
if (lotto[i] == lotto[j]) {
i--;
break;
}
}
}
Arrays.sort(lotto);
System.out.println(Arrays.toString(lotto));
for문은 이렇게 사용했다.
이 중복 제거하는 j에 관한 for문이 처음에는 이해가 잘 안됐다 ,,
근데 곰곰히 생각해보니...
"만약에 lotto[j]의 요소가 그 이전[i]요소에 있다면 i를 빼서 다시 돌아가게끔 한 후, 멈춘다."
뭔가 말로 하니 설명이 안되는데 이런 느낌이겠거니 하는 중이다.
이차원 배열로 했을 땐 랜덤 없앤다고 for문이 세개나 됐음 ^^^^
그러니까 코드가 완전 복잡했고 결론은 삽질이 됐지 ^^^ㅋㅋㅋ
그리고 마지막 단계...
당첨 번호를 출력하고 내 번호와 비교하여, 일치하는 수의 갯수를 찾기!!
근데 나는 왕초보라 사실 Arrays.toString도 몰랐따. 들어보니 그냥 Array로 출력하면 그 배열이 저장된 메모리가 출력된다구? 새로운 지식을 이렇게 또 얻어간다 ㅋㅋ
내가 맞춘 숫자는 0으로 초기화된 변수 하나를 만들고,
for문으로 bundle의 i번째 배열의 인덱스와 Winning의 인덱스를 하나하나 비교해서
일치하는게 있으면 count++; 이렇게 만들어보았다.
System.out.println();
System.out.println("[내 로또 결과]");
int count = 0;
for (int i = 0; i < many; i++) {
count = 0;
for (int j = 0; j < 6; j++) {
if (bundle.get(i).contains(Winning[j])){
count++;
}
}
System.out.println("맞춘 개수: " + myLottery[i] + " " +count + "개");
}
}
}
여기서도 .get이라든가, contains라든가 전혀 메서드를 사용할 생각을 못했음.
ㅠㅠㅠ
메서드를 활용할 생각을 해야하는데 나는 뭐 메서드도 하나만 쓸 수 있는 줄 알았다...
잊지않고 쓸 수 있도록 오늘은 메소드맨 노래를 열심히 들어야겠다.....
아래는 이제 전체 코드다!.
import java.util.*;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Random rdm = new Random();
System.out.println("[로또 당첨 프로그램]");
ArrayList<TreeSet> bundle = new ArrayList<>();
System.out.print("구매 개수를 입력해 주세요.(1~10): ");
int many = sc.nextInt();
char[] myLottery = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
for (int i = 0; i < many; i++) {
TreeSet<Integer> number = new TreeSet<>();
while (number.size()<6){
number.add(rdm.nextInt(45)+1);
}
bundle.add(number);
}
for (int i = 0; i < many; i++) {
System.out.print(myLottery[i]);
System.out.println(bundle.get(i));
}
System.out.println();
System.out.println("[로또 발표]");
int[] lotto = new int[6];
for (int i = 0; i < 6; i++) {
lotto[i] = rdm.nextInt(45) + 1;
for (int j = 0; j < i; j++) {
if (lotto[i] == lotto[j]) {
i--;
break;
}
}
}
Arrays.sort(lotto);
System.out.println(Arrays.toString(lotto));
System.out.println();
System.out.println("[내 로또 결과]");
int count = 0;
for (int i = 0; i < many; i++) {
count = 0;
for (int j = 0; j < 6; j++) {
if (bundle.get(i).contains(lotto[j])){
count++;
}
}
System.out.println("맞춘 개수: " + myLottery[i] + " " +count + "개");
}
}
}
import java.util.*;
class lottery {
public static void cal() {
ArrayList<TreeSet> myLottery = new ArrayList<>();
int[] winNumber = new int[6];
Scanner sc = new Scanner(System.in);
Random rdm = new Random();
int count = 0;
char[] name = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
System.out.println("[로또 당첨 프로그램]");
System.out.print("구매개수를 입력해 주세요.(1~10) : ");
int number = sc.nextInt();
if (0 > number && number > 10) {
System.out.print("다시 입력해 주세요. : ");
sc.nextInt();
}
for (int i = 0; i < number; i++) {
TreeSet<Integer> myNumbers = new TreeSet<>();
while (myNumbers.size() < 6) {
myNumbers.add(rdm.nextInt(45) + 1);
}
myLottery.add(myNumbers);
}
for (int i = 0; i < number; i++) {
System.out.print(name[i]);
System.out.println(myLottery.get(i));
}
System.out.println();
System.out.println("로또 발표");
for (int i = 0; i < winNumber.length; i++) {
winNumber[i] = rdm.nextInt(45) + 1;
for (int j = 0; j < i; j++) {
if (winNumber[i] == winNumber[j]) {
i--;
break;
}
}
}
Arrays.sort(winNumber);
System.out.println(Arrays.toString(winNumber));
System.out.println();
for (int i = 0; i < number; i++) {
count = 0;
for (int j = 0; j < 6; j++) {
if (myLottery.get(i).contains(winNumber[j])) {
count++;
}
}
System.out.println("맞춘 개수 " + name[i] + " " + count + "개");
}
}
}
public class Main {
public static void main(String[] args) {
lottery.cal();
}
}
모쪼록 이 험난한 여정에서....
나의 어려움...궁금증을 해결해주시는데 도움을 주는 모든 분들에게 샤라웃 하고싶다........
¡Muchas Gracias, mis compañeros!🖤
잘했어요