> [!date] published: 2022-05-01
[코딩테스트 연습 - 로또의 최고 순위와 최저 순위 \| 프로그래머스 스쿨](https://programmers.co.kr/learn/courses/30/lessons/77484)
## 🌟 문제
`로또 6/45`(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다.
| 순위 | 당첨 내용 |
| ------- | -------------------- |
| 1 | 6개 번호가 모두 일치 |
| 2 | 5개 번호가 일치 |
| 3 | 4개 번호가 일치 |
| 4 | 3개 번호가 일치 |
| 5 | 2개 번호가 일치 |
| 6(낙첨) | 그 외 |
로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.
민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
## 🌟 풀이
일부 번호를 알아볼 수 없게 된 로또 번호 목록을 입력받고, (알아볼 수 없는 일부 번호는 0으로 표시되어 있다.) 당첨 번호를 받았을 때 받을 수 있는 최고 순위 (그러니까 최대로 많은 숫자를 일치시킬 수 있는 경우) 와 최저 순위를 구하는 문제이다.
**(1)** 일단 0의 개수를 구해야 한다. 이 녀석은 조커와 비슷한 느낌으로 어떤 숫자도 될 수 있다. (`zero` 변수)
**(2)** 그리고 `lottos`를 돌면서 현재 `win_nums`에 해당 숫자가 있는지 확인하고 (feat. find 함수) 숫자가 있으면 `yes` 변수를 증가시키고, 없으면 `no` 변수를 증가시킨다.
**(3)** 가장 높은 순위를 받을 수 있는 경우는 `zero`에 해당하는 숫자들이 모두 `win_nums`에 있는 경우기 때문에 `yes+zero`개의 숫자가 일치하는 순위가 될 것이고
가장 낮은 순위를 받을 수 있는 경우는 반대로 `zero`에 해당하는 숫자들이 모두 `win_nums`에 없는 경우일 것이기 때문에 `yes`개의 숫자가 모두 일치하는 순위일 것이다.
**(4)** 그 숫자대로 순위를 나누어서 `answer` 벡터에 넣어주면 문제 해결 완료!
## 🌟 코드
```cpp
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> lottos, vector<int> win_nums) {
vector<int> answer;
int zero = 0, yes = 0, no = 0;
// 1. zero, yes, no 변수의 값 정하기
for(int i = 0; i < 6; i++)
{
if (lottos[i] == 0)
zero++;
else if (find(win_nums.begin(), win_nums.end(), lottos[i]) == win_nums.end())
no++;
else
yes++;
}
// 2. 최대 순위 결정
if (yes + zero >= 2)
answer.push_back(7 - (yes + zero));
else
answer.push_back(6);
// 3. 최소 순위 결정
if (yes >= 2)
answer.push_back(7 - yes);
else
answer.push_back(6);
return answer;
}
```