차차로그
[JS] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 로또의 최고 순위와 최저 순위 본문
분명 레벨1이라고 해서 풀었는데 어려움..
나는 마이너스레벨이다

내 로또 번호를 확실히 알 수 없을 때 로또 당첨 최고 순위와 최저 순위를 찾아라!
주의할 점
1. 내 로또에서 0은 맞을 수도, 틀릴 수도 있다.
2. 내 로또와 당첨 로또가 하나도 안 맞을 수도 있다.
function solution(lottos, win_nums) {
let count = 0;
let zeroCnt = 0;
for(var i = 0; i < lottos.length; i++){
for(var j = 0; j < win_nums.length; j++){
if(lottos[i] == win_nums[j] && lottos[i] != 0){
count++;
}
}
if(lottos[i] == 0){
zeroCnt++;
}
}
if(count == 0 && zeroCnt == 0){
var answer = [6, 6];
}else{
answer = [7-count-zeroCnt, count == 0 ? 6 : 7-count];
}
return answer;
}
처음에는 하나도 감을 못 잡고 일일이 if문 switch문써서 하드코딩을 했다.. 그런데도 틀림 아놔 ㅠ
다시 싹다 지우고 시작을 했다.
먼저 내 로또와 당첨로또에서 일치하는 번호 개수를 찾기 위해 이중 for문을 돌려서 count를 올렸다.
이때 내 로또에서 0이 아닌 경우는 배제하고 따로 if문을 작성해 제로카운트 수를 플러스했다.
answer = [7-count-zeroCnt, count == 0 ? 6 : 7-count];
처음에는 if문 없이 위 코드만 작성했다.
6개를 맞았을 때면 로또에 0이 없으니까 7-6-0, 7-6해서 [1,1]
5개를 맞았을 때 0이 1개일 수도 있고 아닐 수도 있다.
0이 1개일 경우가 예상할 수 있는 최고 순위기 때문에 zeroCnt는 1로 둔다.
[7-5-1, 7-5]해서 [1,2] 최고 1등 최저 2등
이런식으로 계속 계산을 하면 되는데 만약에 하나도 맞지 않는 경우가 생길 수도 있다.
그런 경우에는 최저 순위는 무조건 6등이다.
그래서 삼항연산자를 써서 count ==0이면 6이 들어가게 코드를 작성했다.
이렇게 돌렸을 때 자꾸 14번 케이스에서 오류가 났다.
분명 내 로또랑 당첨 로또랑 다 안 다른 경우를 생각하고 코드를 짰다고 생각했는데 아니었음..
만약에 두 번호가 모두 다른 경우에도 내 로또 번호가 모두 0일 수도 있고 완전히 [1,2,3,4,5,6] / [7,8,9,10,11,12]처럼 다를 수도 있다.
내가 짠 코드로는 전자인 경우만 필터링됐기에 후자의 경우 값이 제대로 나오지 않은 것이었다.
맞는 숫자도 0이고 0 개수도 0일 때 조건을 걸어서 무조건 [6,6]이 되게 작성하니 드디어 테스트 통과!!
풀이시간이 꽤 걸린 것을 보면 .. 그렇게 좋은 코드는 아니다.
그래도 포기않고 끝까지 풀었다는 것에 의의를 둔다..!
function solution(lottos, win_nums) {
const rank = [6, 6, 5, 4, 3, 2, 1];
let minCount = lottos.filter(v => win_nums.includes(v)).length;
let zeroCount = lottos.filter(v => !v).length;
const maxCount = minCount + zeroCount;
return [rank[maxCount], rank[minCount]];
}
다른 사람 문제 풀이
나올 수 있는 순위를 배열에 담고 filter메소드로 카운트를 정했다.
filter메소드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환한다.
lottos의 길이만큼 인덱스 값을 뽑아내 win_nums가 그것을 포함하고 있는지를 체크한다. 포함을 한다면 그것을 새로운 배열로 만들어 그 길이를 재면 일치하는 숫자의 개수를 구할 수 있다.!0 은 true인 것을 이용해 인덱스 값에 0이 있으면 그것만으로 배열을 만들어 그 개수를 구할 수 있다 .... (대박!!!!!)
변수 maxCount는 일치하는 개수, 0의 개수를 더한 값. 0이 모두 맞을 수도 있기 때문에!
만약에 maxCount가 6개면 rank[6]을 찾고 minCount가 0이면 rank[0]을 찾아 [1,6]을 리턴한다.
진짜 코드보고 미쳤다 소리 나왔다.
풀이시간도 훨씬 짧다!!!!
filter나 !0이나 잘 안 써봐서 처음에는 코드를 봐도 어떻게 푸는 건지를 잘 몰랐다.
내가 푸는 것도 중요하지만 다른 사람의 풀이를 보고 해석하는 것도 중요하다는 것을 다시 깨닫게 된 시간..
물론 어렵고 머리 깨지겠지만 하루에 하나..이틀에 하나씩이라도 꼭 풀어보자 ..!!

'코딩테스트' 카테고리의 다른 글
[JS] 월간 코드 챌린지 시즌1 > 두 개 뽑아서 더하기 (0) | 2022.08.12 |
---|---|
[JS] 월간 코드 챌린지 시즌1 > 내적 (0) | 2022.08.12 |
[JS] 월간 코드 챌린지 시즌3 > 없는 숫자 더하기 (0) | 2022.08.12 |
[JS] 월간 코드 챌린지 시즌2 > 음양 더하기 (0) | 2022.08.12 |
[JS] 2021 카카오 채용연계형 인턴십 > 숫자 문자열과 영단어 (0) | 2022.08.05 |