티스토리 뷰
💡 문제
🔍 분석 및 계획
✅ 문제 이해
일부 번호가 가려진 로또번호와 당첨 로또 번호가 주어졌을 때 가려진 번호로 나올수 있는 최저, 최고의 당첨 등수를 맞추는 문제이다
- 입력 값 : 가려진 로또번호, 당첨 로또번호
- 가려진 번호는 숫자 0으로 표시
- 로또 번호는 모두 6자리 정수이다
- 정렬되어 있지 않음
- 0을 제외하고는 중복되는 수는 없다.
- 빈배열 없음, 잘못된 값은 들어 있지않음 - 출력 값 : 최고 등수와 최저등수가 들어있는 배열
최고 순위와 최저 순위를 계산하기 위해서는 두 가지 정보를 가지고 있어야 한다
- 일치하는 번호의 개수
- 가려진 번호의 개수
두가지를 이용하면
- 최저 등수 <= 일치하는 번호의 개수
- 최고 등수 <= 일치하는 번호의 개수 + 가려진 번호의 개수
위와 같이 출력값에 들어가는 값을 구할 수 있다
로또 숫자의 개수와 원소의 개수가 정해져 있기 때문에 주어진 입력값의 변화에 따라 정렬이나 왠만한 내장함수를 써도 O(1)시간이 걸리기때문에 가독성을 위주로 고민해봐도 시간복잡도 상의 큰 불이익은 없을 듯하다.
이럴때는 맘 놓고 includes 함수를 사용하기로 한다!
✅ 의사코드 작성
//lottos함수를 반복문으로 순회하며 결과값으로 일치하는 번호의 개수와, 0의개수를 반환
//순위를 계산하는 조건문
//if(일치하는 개수 1개 이하) return 6
//else return (7-일치하는 개수)
📝 코드 구현
의사코드 + 코드
function solution(lottos, win_nums) {
let max, min;
//lottos함수를 반복문으로 순회하며 결과값으로 일치하는 번호의 개수와, 0의개수를 반환
let [matched, undecided] = lottos.reduce((acc, cur) => {
if (cur === 0) {
acc[1]++;
return acc;
} else {
if (win_nums.includes(cur)) acc[0]++;
return acc;
}
}, [0, 0]) || [0, 0];
//순위를 계산하는 조건문
//if(일치하는 개수 1개 이하) return 6
//else return (7-일치하는 개수)
min = matched <= 1 ? 6 : 7 - matched;
max = matched + undecided <= 1 ? 6 : 7 - (matched + undecided);
return [max, min];
}
최종 코드
function solution(lottos, win_nums) {
let max, min;
let [matched, undecided] = lottos.reduce((acc, cur) => {
if (cur === 0) {
acc[1]++;
return acc;
} else {
if (win_nums.includes(cur)) acc[0]++;
return acc;
}
}, [0, 0]) || [0, 0];
min = matched <= 1 ? 6 : 7 - matched;
max = matched + undecided <= 1 ? 6 : 7 - (matched + undecided);
return [max, min];
}
시간 복잡도 : O(1)
마음 껏 함수를 써도 상관없는 문제였으나 결국 소극적인 코드가 나와버렸다
💭 되돌아 보기
✅ 개선점
✅ 다른 사람 풀이
1.
minCount와 zeroCount를 각각 실행해주면서 코드가 훨씬 짧아졌다. 또한 랭크를 위한 배열을 따로 생성했다.
이렇게 과감하게 해주었어야 했다..
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]];
}
'IT기초 > 프로그래머스 문제풀이' 카테고리의 다른 글
| [프로그래머스 LV.1] #26 신규 아이디 추천 (JavaScript) (0) | 2023.05.25 |
|---|---|
| [프로그래머스 LV.1] #25 음양 더하기 (JavaScript) (0) | 2023.05.24 |
| [프로그래머스 LV.1] #23 약수의 개수와 덧셈 (JavaScript) (0) | 2023.05.22 |
| [프로그래머스 LV.1] #22 숫자 문자열과 영단어 (JavaScript) (0) | 2023.05.21 |
| [프로그래머스 LV.1] #21 부족한 금액 계산하기 (JavaScript) (0) | 2023.05.20 |
댓글
