Coding Test/Programmers_JavaScript

[JavaScript/프로그래머스] Dev-Matching: 웹 백엔드 개발자(상반기) - 로또의 최고 순위와 최저 순위

  • -
728x90

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


초기 정답 코드

function solution(lottos, win_nums) {
  let answer = [];
  let sameNumCount = 0;
  let zeroCount = 0;
  // lottos와 win_nums를 크기순으로 정렬
  // 우선 이 둘의 같은 숫자의 개수와 0의 개수를 따로 저장
  // 같은 숫자의 개수는 최저 점수가 될 것이고, 같은 숫자 + 0의 개수를 더한 순위는 최고 점수가 될 것
  lottos.forEach((l) => {
    if (win_nums.includes(l)) {
      sameNumCount++;
    } else if (l === 0) {
      zeroCount++;
    }
  });
  console.log(sameNumCount, zeroCount);
  // 0 1 2 3 4 5 6
  // 6 6 5 4 3 2 1
  answer = [...answer, 7 - (sameNumCount + zeroCount), 7 - sameNumCount];
  answer[0] = answer[0] > 6 ? 6 : answer[0];
  answer[1] = answer[1] > 6 ? 6 : answer[1];
  return answer;
}

 

로직 설명

이 코드는 로또 게임의 결과를 예측하는 함수입니다. 

로또 게임의 숫자 배열 'lottos'와 당첨 숫자 배열 'win_nums'를 입력으로 받아, 최고 순위와 최저 순위를 반환합니다. 


변수 answer, sameNumCount, zeroCount를 초기화합니다. 

  • sameNumCount는 로또 번호와 당첨 번호의 일치하는 숫자의 개수를 저장하고, 
  • zeroCount는 로또 번호 중 0의 개수를 저장합니다.

forEach()를 사용하여 'lottos' 배열의 각 요소를 순회하면서 다음 작업을 수행합니다.

  • 만약 해당 로또 번호가 'win_nums' 배열에 존재하면, sameNumCount를 1 증가시킵니다.
  • 해당 로또 번호가 0이면, zeroCount를 1 증가시킵니다.

이후에 최고 순위와 최저 순위를 계산하여 answer 배열에 저장합니다. 

계산 방식은 다음과 같습니다.

  • 최고 순위: 7 - (sameNumCount + zeroCount)
  • 최저 순위: 7 - sameNumCount
  • 최고 순위와 최저 순위가 6보다 큰 경우, 즉 유효하지 않은 순위인 경우에는 값을 6으로 바꿔줍니다.

마지막으로 answer 배열을 반환합니다. 

이 배열에는 [최고 순위, 최저 순위]의 형태로 값이 저장되어 있습니다.

 

간단한 예시를 들어 설명하겠습니다. 예를 들어, 다음과 같은 입력이 주어졌다고 가정해봅시다.

lottos: [44, 1, 0, 0, 31, 25]
win_nums: [31, 10, 45, 1, 6, 19]

이 경우, sameNumCount는 2가 되고(번호 1과 31이 일치), zeroCount는 2가 됩니다(0이 두 개 있음). 

따라서 최고 순위는 7 - (2 + 2) = 3, 최저 순위는 7 - 2 = 5가 됩니다. 결과적으로 함수는 [3, 5]를 반환합니다.

 


 

1차 개선 - 순위계산 로직 분리

  1. answer 배열을 미리 초기화하지 않고, 최종적으로 계산된 순위를 바로 대입합니다. 이렇게 하면 코드가 더 간결해집니다.
  2. 순위를 계산하는 로직을 rank 함수로 분리하여 중복 코드를 줄였습니다. 이 함수는 숫자를 입력으로 받아, 7에서 입력값을 뺀 값과 6 중 작은 값을 반환합니다. 이렇게 하면 유효한 순위를 쉽게 계산할 수 있습니다.
  3. 최종적으로 계산된 최고 순위와 최저 순위를 바로 반환하도록 변경하였습니다.
function solution(lottos, win_nums) {
  let sameNumCount = 0;
  let zeroCount = 0;

  lottos.forEach((l) => {
    if (win_nums.includes(l)) {
      sameNumCount++;
    } else if (l === 0) {
      zeroCount++;
    }
  });

  const rank = (matchedCount) => Math.min(7 - matchedCount, 6);

  const highestRank = rank(sameNumCount + zeroCount);
  const lowestRank = rank(sameNumCount);

  return [highestRank, lowestRank];
}

 


End

 

 

 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.