문제
문제 설명
- 본인이 적은 로또 번호와, 실제 로또 번호가 있다.
- 근데 본인이 적은 로또 번호 n개를 모르는 상태
- 이 때 당첨될 수 있는 경우의 수를 구하는 것
문제 핵심
- 최소 등수
최소 등수 = 모르는 것을 모두 틀렸다고 하고, 맞춘 갯수
- 최대 등수
최대 등수 = 모르는 것을 모두 맞았다고 하고, 맞춘 갯수
- 로 구할 수 있다.
- 그래서 모르는 것들의 갯수를 구하고, 모르는걸 제외한 맞춘 갯수를 구하면 끝!
- 물론 맞춘 갯수를 등수로 다시 변환을 해줘야된다.[이는 문제에 나와있음!]
알고리즘
- 정렬[X]
- 민우[문제 주인공] 로또 번호를 순회하면서
- 0이 있는 경우
zeros_count
1 증가
- 민우가 적은 로또 번호가 맞은 경우
right_count
1 증가
- 계산
- 최대로 맞은 갯수 = zeros_count + right_count
- 최소로 맞은 갯수 = right_count
- 갯수 -> 등수 변환
- 벡터로 변환 -> 끝!
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int get_rank(int size) {
if (size == 6) return 1;
else if (size == 5) return 2;
else if (size == 4) return 3;
else if (size == 3) return 4;
else if (size == 2) return 5;
else return 6;
}
vector<int> solution(vector<int> lottos, vector<int> win_nums) {
int right_count = 0;
int zeros_count = 0;
for (int i = 0; i < lottos.size(); i++) {
if (lottos[i] == 0) {
zeros_count++;
}
if (find(win_nums.begin(), win_nums.end(), lottos[i]) != win_nums.end()) {
right_count++;
}
}
int maximum_size = right_count + zeros_count;
int minimum_size = right_count;
int maximum_rank = get_rank(maximum_size);
int minimum_rank = get_rank(minimum_size);
return {maximum_rank, minimum_rank};
}