본문 바로가기

블록체인기반 SW 개발자 과정(feat.경일게임아카데미)/과제

<JAVASCRIPT> 22.05.25 일자 과제 / 로또번호 생성기

오늘의 과제!!!     로!또!번!호! 생!성!기!

 

 

 

 

 

로또번호 6개를 생성하는 코드를 구현하면된다.

룰은 로또와 같다고 생각하면 된다.

 

 

규칙

1. 1~45사이의 숫자 중에 랜덤하게 뽑는다

2. 6개의 숫자를 뽑는다.

3. 뽑은 숫자중에 중복된 숫자가 없어야 한다.

4. 배열을 활용한다.

 

 

보통 1~45의 숫자를 하나씩 배열에 담는다.

그 다음 랜덤하게 1~45 중에 숫자를 6개 뽑는다. 이때 중복된 숫자를 찾아 배열에서 제거한다.

숫자가 6개가 아니라면 부족한 만큼 뽑는다.  

 

 

 

 

처음 과제를 받았을 때 어떻게 만들까 고민을 했다.

이 날 indexOf() 메서드를 배웠는데 일일히 인덱스의 각 값을 비교하면 코드를 짜는데 오래걸릴 것 같아서

 

 

혹시 중복검사를 해주는 메서드가 있을까 싶어 검색해보았다

 

.

오케이 구글... 내 코딩을 도와라....

 

 

 

그랬더니 세상에... 알아서 중복값을 제거해주는 메서드가 있었다!!!!!

 

 

 

그건 바로 Set !!!!

오호... 쓰는 방법은

 

let set객체를담을변수 = new Set(객체로변경시킬대상);

요로코롬.... 쓰면된다.

 

그래서 내 생각은 이러했다.

무작위로 1~45사이의 숫자중 6개를 뽑고 set으로 중복인 숫자를 지운 다음에 다시 배열로 바꿔주는 것이다.

그리고 중복을 제거한 후에 숫자가 6개인지....ㅊ...ㅔ.....ㅋ....ㅡ.....................

 

 

......?????

 

이렇게 복잡하게 하는거 맞아....??

 

 

 

 

음.....일단 만들긴....만들었다.....

 

//let lottoNumber = [];

let myNum = new Array(); //뽑은 6개 담을 배열
let lottoNumrand = []; // 로또 숫자각각 뽑힐 확률을 담은 배열
let pick = 0;
let random = 0;
let set_lotto = [];
let count = 0;
function randomInt() {
  //1~45사이의 랜덤한 수 뽑아주는 함수
  pick = Math.floor(Math.random() * 44 + 1);
  console.log("pick : " + pick);
}

document.write("이번주 로또번호는<br><br>");
while (count <= 1) {
  //여기까지 일단 6개 뽑아서 배열에 넣어줌
  for (let j = 0; j < 6; j++) {
    randomInt();
    myNum[j] = pick;
  }
  //set으로 중복값 제거 - set은 배열이 아님
  let set_myNum = new Set(myNum);
  set_lotto = Array.from(set_myNum);
  if (set_lotto.length === 6) {
    for (let k = 0; k < 6; k++) {
      //최종로또번호 출력
      document.write(k + 1 + "번째 번호");
      document.write(set_lotto[k] + "<br>" + "<br>");
    }
  } else {
  }
  count++;
}

오 그럴듯해 일단 set으로 중복검사 후 제거까지는 잘하는데.... 문제는.... set을 이용하게 되면 배열을 객체로 만든 후에

중복검사를 하기 때문에 만약 중복되는 숫자가 존재해서 제거 된다면 배열로 다시 바꿨을 때 인덱스가 하나 모자라게 된다는 것이다.... 로또숫자는 6개인데 5개만 뽑아버렷....!!ㅋㅋㅋㅋ

 

 

 

 

 

음.....ㅋㅋㅋ

음.... 사용자가 새로고침을해서 숫자가 6개가 나올때 까지 돌리는 방식으로 사용해주면....?

 

그렇게 사용해주면 안댈까? 찡긋-☆

 

 

 

 

안되겠지?ㅋㅋㅋㅋ

 

 

그래서 일단 과제 제출을 위해 코드를 싹 갈았다ㅋㅋㅋ큐ㅠㅠ 

 

 

<진짜 real------로또 뽑기>

let myNum = 0; //랜덤으로 뽑은 숫자를 담을 변수
let mylotto = []; // 로또번호 집어넣을 배열
let count = 1;

alert("로또번호를 뽑습니다!! 행운을 빌게요");

while(count !=0){
    mylotto.splice(0,6); //매 시도마다 새로 담기위해 배열비워줌

for (let i = 0; i < 6; i++) {
    myNum = Math.floor((Math.random() * 44) + 1);
    if (mylotto.indexOf(myNum) == -1) {
        mylotto.push(myNum);
    } else if (mylotto.indexOf(myNum) != -1) {

        i--;
    }
    alert("이번주 로또번호 : " + mylotto);

}
    count =Number(prompt("종료를 원한다면 '0'을 누르세요"));
}

짜잔! 이렇게 완성했다. set으로 쓰려던 것 보다 훨씬 간단하다

 

주석으로 달아놨듯이 랜덤으로 숫자를 뽑아주고 그걸 배열에 담는다

그리고 중복검사를 해서 중복되는것이 없으면 배열에 담도록 했다.

 

각 메서드들의 정리는 밑에서 하고

 

 

mylotto.splice(0,6);

요 부분이 중요하다!!!! 

for문을 돌면서 랜덤한 숫자를 뽑아서 배열에 담는다. 이 상태에서 계속 for문을 돌리면 6개가 이미 차있기 때문에 

첫번째 시도로 뽑은 숫자들과 비교해서 중복검사만 반복하게 되는 것이다. 즉, 첫번째로 뽑은 숫자들에서 결과값이 변하지 않는 다는 것.....

 

그래서 한번 숫자들을 뽑고 나면 배열의 내부를 비워주어야 한다.

 

그래서 splice를 사용한 것!

왜 splice를 사용했느냐!

 

배열의 요소를 제거한 후 빈배열을 반환해주기 때문이다.

 

 

요소와 함께 인덱스자체를 지워버리는 메소드도 있기 때문에 조심해야한다. 

 

짐만 뺏느냐 짐도 뺏고 집도 뺏느냐 차이

 

indexOf

arr.indexOf(파라미터);

배열에 파라미터값과 같은 값이 있는지 찾아보고 알려준다. 같은 값이 없으면 -1을 반환하며 같은 값이 배열내에 존재한다면

해당 값의 인덱스 값을 반환한다.

즉,

arr = [1, 2, 3];

arr.indexOf( 1 );  // 2를 반환

arr.indexOf( 4 ); // -1을 반환

요렇게 사용할 수 있다.

 

 

 

 

splice

arr.splice(제거를 시작할 인덱스값, 시작부터 제거할 요소의 개수);

원하는 인덱스부터 지워준다!

 

 

완성코드에 있는걸로 예시를 들자면

mylotto.splice(0,6);

mylotto 배열의 0번째 인덱스부터 6개의 요소들을 지워달라는 명령이 된다.

그래서 안의 값들만 깨끗하게 날리고 6개의 공간은 그대로라는 것!

 

 

 

 

 

ㅎㅎ... 이렇게 짜고나니 set으로 중복검사를 하려고 했던 시도보다 훨씬 짧고 덜 번잡스러워서

기쁘면서도 묘했다ㅠ

 

 

set을 이용한 방법은.... 굉장히 혼자 더 일을 만들어서 한셈ㅠ....

그래도 일단은 좀더 깔끔하게 다듬어서 올리기는 할 예정이다.

 

 

 

 

728x90