문제 설명
제한조건
- lottos는 길이 6인 정수 배열입니다.
- lottos의 모든 원소는 0이상 45이하인 정수입니다.
- 0은 알아볼 수 없는 숫자를 의미합니다.
- 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
- lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
- win_nums은 길이 6인 정수 배열입니다.
- win_nums의 모든 원소는 1이상 45이하인 정수입니다.
- win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
- win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.
입출력 예
lottos | win_nums | result |
[44, 1, 0, 0, 31, 25] | [31, 10, 45, 1, 6, 19] | [3, 5] |
[0, 0, 0, 0, 0, 0] | [38, 19, 20, 40, 15, 25] | [1, 6] |
[45, 4, 35, 20, 3, 9] | [20, 9, 3, 45, 4, 35] | [1, 1] |
나의 풀이
문제에서 요구하는 사항이 최고 등수와 최저 등수이기 때문에 어떻게 최고 등수와 최저 등수를 도출할 수 있을까를 생각해봤다.
최저 등수의 경우 lottos의 원소가 win_nums와 일치하는 부분만 (낙서된 부분이 모두 틀렸다는 가정) 세면 최저 등수가 나오고, 낙서된 부분이 다 맞았다는 가정을 하게 되면 최고 등수를 구할 수 있을 것 같다고 생각했다.
생각부터 코드로 옮기는 부분까지도 얼마 걸리지 않았다.
function solution(lottos, win_nums) {
let correctCount = 0;
let countZero = 0;
lottos.forEach((el)=>{
win_nums.includes(el) ? correctCount++ : 0;
el===0 ? countZero++ : 0;
});
const supposeHighScore = correctCount + countZero;
const supposeLowScore = correctCount;
const answer = [7-supposeHighScore, 7-supposeLowScore];
return answer;
}
생각했던 것을 기반으로 맞춘 개수를 구해준 뒤 등수로 변환해주는 코드를 만들어봤다.
answer의 각 element에 7에서 빼준 이유는 1등일 경우 6개 일치, 2등일 경우 5개 일치, 3등일 경우 4개 일치, ... 이기 때문에 맞은개수 + 순위 = 7 이었기 때문에 순위를 구하기 위해서는 7 - 맞은개수를 해주어야 했기 때문이었다.
하지만 이렇게 작성하고 답안을 작성하니 테스트케이스 14번이 틀렸다고 떴다.
다시 한 번 자세히 보니 맞춘 갯수가 없을 경우에는 순위가 7으로 뜬다. 이 문제에서는 맞춘 갯수가 없거나 1개나 맞췄을 경우 6등을 유지해야 했기 때문에 7등이 아닌 6등으로 수정해주어야 했다.
(위의 ' 맞은개수 + 순위 = 7'이라는 내가 만든 공식은 6등부터는 적용되지 않기 때문이었다)
따라서 7등을 따로 6등으로 수정하는 코드를 추가해주었다.
function solution(lottos, win_nums) {
let correctCount = 0;
let countZero = 0;
lottos.forEach((el)=>{
win_nums.includes(el) ? correctCount++ : 0;
el===0 ? countZero++ : 0;
});
const supposeHighScore = correctCount + countZero;
const supposeLowScore = correctCount;
const answer = [7-supposeHighScore, 7-supposeLowScore];
/* 추가해준 부분 */
answer.forEach((el,idx)=>{
el === 7 ? answer[idx] = 6 : 0;
});
return answer;
}
통과!
코드를 고민하고 구현하는 것보다 점수를 등수로 어떻게 변환해야할지에 더 고민을 많이 했던 문제였던 것 같다.
위에서 서술한대로 6등부터는 다른 규칙이 적용되기 때문에 생각할 부분이 조금 있었던 것 같다.
사실 6개 일치할 경우 1 반환,
사실 5개 일치할 경우 2 반환,
사실 4개 일치할 경우 3 반환,
...
이런식으로 짜면 됐지만 이런식으로 하드코딩을 하긴 싫어서 고민을 많이 했던 것 같다.
결국 생각한 부분이 '7등으로 반환되는 케이스들은 맞춘 개수가 0이기 때문에 그것들만 6등으로 바꿔주면 된다'라는 결론으로 이어졌던 것 같다.
(여담으로 중간 중간 correctCount 나 countZero와 같은 부분이 0, 1 (6,5) 인 케이스 4개를 다 따로 설정해줘야 해야하나 싶은 고민도 하긴 했다.)
'Algorithm' 카테고리의 다른 글
숫자 짝꿍 [프로그래머스] (2) | 2023.12.20 |
---|---|
하샤드 수 [프로그래머스] (1) | 2023.11.10 |
모음 제거 [프로그래머스] (3) | 2023.11.10 |
배열의 유사도 [프로그래머스] (1) | 2023.11.09 |
숫자 짝꿍 [프로그래머스] (1) | 2023.11.07 |