프로그래머스 Level 1 에 있는 문제이다.


function solution(lottos, win_nums) {
// 민우가 구매한 로또 번호를 담은 배열 : lottos,
// 당첨 번호를 담은 배열 win_nums
// 민수가 구매한 로또 번호배열과 로또 당첨배열을 비교하면서 맞춘개수, 0을 뽑아야함
// 최고순위는 맞은 개수에서 0의 개수를 더해주면 됨
// 최저 순위는 그냥 순수 맞은개수, 0은 포함 시키지 않으면됨.
var rank = [6, 6, 5, 4, 3, 2, 1];
var answer = [];
var zeros = lottos.filter(item => !item).length // 0의 개수
var min = lottos.filter(item => win_nums.includes(item)).length; // 맞은 개수
var max = min + zeros; // 0을 포함시킨다는 의미는 0을 다 정답이라고 처리했다는 뜻
answer = [rank[max], rank[min]];
return answer;
}
풀이는 다음과같다.
우선 내가 뭘 구해야하는가? 생각하고, 그걸 구하기 위해선 어떻게 해야하는가? 를 생각해야했다.
먼저 구해야 할 것은, 맞은 개수와 0의 개수이다.
등수는 당연히 맞은 개수에 의해 정해지기 때문에 맞은 개수부터 구해야한다!
그러면 맞은 개수는 어떻게 구해야할까?
맞은개수는 자바스크립트는 배열의 filter 메서드와 includes 메서드를 이용하여 쉽게 구할 수 있다.
filter() 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]
includes() 메서드는 배열이 특정 요소를 포함하고 있는지 판별합니다.
const array1 = [1, 2, 3];
console.log(array1.includes(2));
// expected output: true
const pets = ['cat', 'dog', 'bat'];
console.log(pets.includes('cat'));
// expected output: true
console.log(pets.includes('at'));
// expected output: false
먼저 맞은개수를 구한 코드부터 살펴보자.
var min = lottos.filter(item => win_nums.includes(item)).length;
lottos배열의 요소 하나 하나를 win_nums안에 있는지 판단하고, win_nums에 포함된 요소들을 배열로 반환하는 코드이다.
includes 함수는 true / false만 반환하고, filter는 true를 반환하는 요소를 기준으로 신규 배열을 만들어 반환한다.
즉, lottos 배열이 [44, 1, 0, 0, 31, 25] 이고 win_nums 배열이 [31, 10, 45, 1, 6, 19] 라면, min은 [1, 31] 배열을 반환받을것이다. 따라서 length가 맞은 번호의 개수가 된다.
이제 맞은 개수를 구했으니까 0의 개수를 구한다.
0의 개수는 더욱 간단하게 구할 수 있다.
var zeros = lottos.filter(item => !item).length
여기서 filter는 false를 반환하여 배열을 만들어준다. 0도 false로 인식한다.
lottos 배열 안에 있는 0을 찾아서 0으로만 이루어진 배열의 길이가 zeros 변수에 저장되는 것이다.
여기까지해서 우리는 핵심 값 두 가지를 구했다.
맞은 개수와, 0의 개수이다.
문제는 최저 순위와 최고 순위를 구하는 것이다.
최저 순위는 다른 계산 없이 그냥 처음에 맞은 개수로 판단하면 되고, 최고 순위는 맞은개수 + 0의 개수를 더한 값으로 판단하면된다. (0을 맞은 개수로 쳐야하니깐)
var max = min + zeros;
하지만 여기서 바로 answer 배열에 max와 min을 보내면 틀린다.
왜냐하면, max, min에는 현재 순위가 아니라 맞은개수, 맞은개수 + 0의 개수 등의 개수가 들어가있다. 등수가 아니다!
맞은 개수로 등수를 판단하기 위해 rank 배열을 만들어주었다.
var rank = [6, 6, 5, 4, 3, 2, 1];
6을 2번 쓴 이유는 배열의 인덱스 때문이다.
배열은 알다시피 0부터 시작한다.
문제를 보면 로또는 1등부터 6등까지 있고, 1등은 6개를 맞춘 등수이고, 6등은 2개 미만의 숫자를 맞춘 등수이다.
등수와 맞춘 개수를 연관시켜 생각해보자.
6개를 맞췄으면 1등이다. 그러면 배열의 인덱스가 6인자리에 어떤 숫자가 오면 적합하겠는가?
당연히 1이다! 이것만 알면 왜 배열이 [6, 6, 5, 4, 3, 2, 1] 인지 바로 이해 할 수 있다!
따라서 배열을 위처럼 선언해주고, 답은 다음과 같이 보내준다.
answer = [rank[max], rank[min]];
return answer;
자바스크립트를 이용해서 풀면 그렇게 오래 걸리지 않을 문제라고 생각한다!
1레벨 문제이지만 아직 내 실력으로는 엄청 쉽게 풀진 않은것같다!