<프로그래머스 C++> 로또의 최고순위와 최저순위

2026. 5. 13. 10:05Programmers

문제 설명

로또 번호 일부가 0으로 지워진 상태에서, 당첨 가능한 최고 순위와 최저 순위를 구하는 문제이다.

  • 0은 어떤 번호든 될 수 있다.
  • 0이 아닌 번호는 고정이다.
항목 예시1 예시2 예시3
lottos [44, 1, 0, 0, 31, 25] [0, 0, 0, 0, 0, 0] [45, 4, 35, 20, 3, 9]
win_nums [31, 10, 45, 1, 6, 19] [38, 19, 20, 40, 15, 25] [20, 9, 3, 45, 4, 35]
result [3, 5] [1, 6] [1, 1]

문제 해석

최고 순위와 최저 순위를 구하기 위해서는 두 가지 정보가 필요하다.

  1. 확실히 맞힌 개수(count로 계산) : 0이 아닌 숫자 중에서 win_nums와 같은 번호
  2. 0의 개수(zero로 계산) : 최고 순위에선 전부 당첨으로 가정

결국

 

최고순위 = Count + zero

최저순위 = Count

 

이렇게 계산하면 구할 수 있게 된다.


문제 풀이

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> lottos, vector<int> win_nums) {
    vector<int> answer;
    vector<int> Rank = {6, 6, 5, 4, 3, 2, 1};
    int count = 0, zero = 0;

    // 0 개수 세기
    for(int i = 0; i < lottos.size(); ++i)
        if(lottos[i] == 0) ++zero;

    // 당첨 번호 일치 개수 세기
    for(int i = 0; i < lottos.size(); ++i)
        if(lottos[i] != 0 &&
           find(win_nums.begin(), win_nums.end(), lottos[i]) != win_nums.end())
            ++count;

    answer.push_back(Rank[count + zero]);  // 최고 순위
    answer.push_back(Rank[count]);         // 최저 순위
    return answer;
}

핵심 포인트

1. Rank 배열로 일치 개수 >> 순위 변환

vector<int> Rank = {6, 6, 5, 4, 3, 2, 1};
//   인덱스:         0  1  2  3  4  5  6

 

인덱스가 일치한 번호의 개수이고, 값을 순위로 따진다.

항목 0개 1개 2개 3개 4개 5개 6개
인덱스 0 1 2 3 4 5 6
순위 6 6 5 4 3 2 1

 

0개와 1개 일치는 둘 다 6등이기 때문에 인덱스 0, 1은 둘 다 6등으로 설정했다.

 

count + zero가 최대 6까지 나오기 때문에 배열크기를 7개로 잡아야 범위를 벗어나지 않는다.

 

2. find로 win_nums 안을 확인

find(win_nums.begin(), win_nums.end(), lottos[i]) != win_nums.end()

트러블 슈팅

Rank 배열 범위

처음엔 Rank배열을 이렇게 설정했다.

vector<int> Rank = {6, 5, 4, 3, 2, 1};  // 크기 6

 

이렇게 하니까 count+zero가 최대 6이기때문에 Rank[6]에 접근하면 범위를 벗어나서 오류가 발생했다.

또 1개를 맞았을 경우엔 5등이 출력되어 오류가 발생했다.

 

그래서 0개를 맞았을 때, 1개를 맞았을 때 모두 6등으로 리턴되어야 하기 때문에 배열의 앞 부분에 6을 추가했다.

vector<int> Rank = {6, 6, 5, 4, 3, 2, 1};  //크기 7