숫자야구

.·2021년 7월 26일
0

1부터 9까지 숫자가 담긴 배열 만들기

무작위로 4개 뽑기

처음에 스스로 만들었을 때는 배열을 따로 만들지 않았고 중복을 피하기 위해 while 문을 돌렸다. 하지만 이 방법이 훨씬 효율적인 것 같다.

const numbers = Array(9)
  .fill()
  .map((v, i) => i + 1);
console.log(numbers);

for (let i = 0; i < 4; i++) {
  const index = Math.floor(Math.random() * numbers.length);
  answer.push(numbers[index]);
  numbers.splice(index, 1);
}

for 문을 돌려서 1부터 9까지 담긴 배열을 만들 수 있지만 배열의 메서드를 사용하는 것을 책에서 추천해 주었다.

1부터 9까지 숫자를 원소로 가진 배열 만들기

  1. array(9)는 길이가 9인 배열을 만든다
  2. fill()은 원소를 undefined으로 만들어 준다.
  3. map은 원소들을 돌면서 새로운 배열을 만드는데 index를 이용해서 index+1을 원소로 가지는 배열을 만들어준다

배열에서 4개 랜덤으로 뽑기

0-9까지 담긴 배열을 만든 뒤 하나씩 랜덤으로 하나씩 뽑고 뽑은 것은 중복을 피하기 위해 삭제해 준다

  1. for문을 사용한다
  2. Math.random 을 사용해주는데 index를 사용해 줄꺼라서 0이상 numbers.length 미만으로 지정해준다.
  3. random으로 만들어진 index를 사용해서 정답에 넣어준다
  4. splice는 배열을 직접적으로 변경시키는데 중복을 피하기 위해 해당 index에 있는 숫자를 제거해준다
  • Math.random에서 10 아닌 numbers.length로 지정하는것도 중복을 피하기 위해 배열을 계속 변경해 줘야 하기 때문이다.

기억하고 싶은 코드 1

const checkValidity = (input) => {
  if (input.length !== 4) return alert("숫자 4개를 입력하세요");
  if (tries.includes(input)) return alert("이미 입력하신 숫자입니다");
  if (new Set(input).size !== 4)
    return alert("4가지 다른 숫자를 입력해 주세요");
  return true;
};
  1. 제일 간단한 것부터 if 문으로 check 해준다
  2. alert 함수는 undefined을 return 하므로 if문으로는 false가 된다.
  3. new Set()은 중복을 허용하지 않는 특수한 배열이다
  4. new Set('1234')을 하면 Set 내부에는 1,2,3만 들어간다
    또한 Set의 요소 개수를 구할 때는 length가 아니라 size를 사용한다

기억하고 싶은 코드 2

const getResult = (input) => {
  const result = { strike: 0, ball: 0, out: 0 };
  answer.forEach((number, aIndex) => {
    const index = input.indexOf(String(number));
    if (index > -1) {
      if (index === aIndex) result.strike++;
      else result.ball++;
    }
  });
  return result;
};

입력한 값이 몇개의 스트라이크와 몇개의 볼을 가지는지 판단해서 return 하는 함수이다

  1. 정답배열을 돌면서 입력한것에 정답원소가 있는지 확인해준다
  2. indexOf 를 사용해주는데 순서까지 맞는지 index를 비교해 주기 위해서이다.
  3. 만약 정답원소가 입력한것에 없다면 -1을 return 하므로 if(index>-1)를 사용해준다
  4. if 문을 통과하면 순서도 같은지 확인해준다.
  5. 순서가 같지 않다면 정답원소가 입력한 값에 있지만 순서는 같지 않으므로 ball이다
profile
Divde & Conquer

0개의 댓글