Programmers 로또의 최고 순서와 최저 순위
- 최초 작성일: 2021년 10월 01일(금)
- 주소: https://programmers.co.kr/learn/courses/30/lessons/77484
목차
[TOC]
문제 설명
- 로또 6/45`(이하 ‘로또’로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다.
순위 | 당첨 내용 |
---|---|
1 | 6개 번호가 모두 일치 |
2 | 5개 번호가 일치 |
3 | 4개 번호가 일치 |
4 | 3개 번호가 일치 |
5 | 2개 번호가 일치 |
6(낙첨) | 그 외 |
-
로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.
-
알아볼 수 없는 번호를
0
으로 표기하기로 하고, 민우가 구매한 로또 번호 6개가44, 1, 0, 0, 31 25
라고 가정해보겠습니다. 당첨 번호 6개가31, 10, 45, 1, 6, 19
라면, 당첨 가능한 최고 순위와 최저 순위의 한 예는 아래와 같습니다.당첨 번호 31 10 45 1 6 19 결과 최고 순위 번호 31 0→10 44 1 0→6 25 4개 번호 일치, 3등 최저 순위 번호 31 0→11 44 1 0→7 25 2개 번호 일치, 5등 - 순서와 상관없이, 구매한 로또에 당첨 번호와 일치하는 번호가 있으면 맞힌 걸로 인정됩니다.
- 알아볼 수 없는 두 개의 번호를 각각 10, 6이라고 가정하면 3등에 당첨될 수 있습니다.
- 3등을 만드는 다른 방법들도 존재합니다. 하지만, 2등 이상으로 만드는 것은 불가능합니다.
- 알아볼 수 없는 두 개의 번호를 각각 11, 7이라고 가정하면 5등에 당첨될 수 있습니다.
- 5등을 만드는 다른 방법들도 존재합니다. 하지만, 6등(낙첨)으로 만드는 것은 불가능합니다.
-
민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
제한사항
- 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 벡터의 원소를 모두 돌며 비교하며 같을 때 count를 1 증가 해주고, lottos 벡터에서 0을 만났을 때 zero_count를 1 증가 해준다.
- 그런 후, 출력 시 7-(일치하는 숫자의 카운트 + lottos의 0의 갯수) 해주면 최고 순위를 구할 수 있다.
- 그리고, 7-(일치하는 숫자의 카운트) 해주면 최저 순위를 구할 수 있다.
- 하지만 1개 혹은 0개를 맞췄을 때에는 7이 나올 수 있으므로 그럴 경우 6을 출력하도록 해준다.
- 처음에 이 문제를 봤을 때, 두 벡터를 정렬하고 시작하고 싶어서 정렬을 했었는데, 어차피 다 돌거면 그럴 필요가 없었다.
- 그런데 여기서 추가해줄 것이 있는데, 아래의 코드를 보면 break한 부분을 볼 수 있는데 그것은 같은 것을 찾았을 때 혹은 0을 발견했을 때에는 나머지 숫자와의 비교가 불필요하므로 바로 작업을 멈추고 다음 단계로 넘어가도록 해주어야 시간을 줄일 수 있다.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> lottos, vector<int> win_nums) {
vector<int> answer;
//sort(lottos.begin(), lottos.end());
//sort(win_nums.begin(), win_nums.end());
int count = 0;
int zero_count = 0;
for (int i = 0; i < lottos.size(); i++) {
for (int j = 0; j < win_nums.size(); j++) {
if (lottos[i] == 0) {
zero_count++;
break;
}
else {
if (lottos[i] == win_nums[j]) {
count++;
break;
}
}
}
}
if ((count+zero_count) < 2) {
answer.push_back(6);
answer.push_back(6);
}
else{
answer.push_back(7-(count+zero_count));
if (count < 2) {
answer.push_back(6);
}
else {
answer.push_back(7-count);
}
}
return answer;
}