[ C++ ] 프로그래머스: 로또의 최고 순위와 최저 순위
✏️ PS/Programmers

[ C++ ] 프로그래머스: 로또의 최고 순위와 최저 순위

반응형

 

안녕하세요? 수구리입니다.

이번 포스팅에서도 프로그래머스 문제를 가져왔습니다~

이 문제에서는 로또와 관련된 문제인데요.

vector에서 find 함수에 대한 내용입니다. 문제는 아래 링크에 두었습니다

생각해야 할 조건이 있으니 천천히 읽어보고 오시는 것을 추천드립니다!

 

 

 

[ 문제 ] 프로그래머스: 로또의 최고 순위와 최저 순위

https://programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

 

 

 

 

[ 나의 풀이 ]

#include <algorithm>
#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> lottos, vector<int> win_nums) {
    vector<int> answer; // [최고 순위, 최저 순위]
    
    int hit = 0;  // 맞춘 번호의 개수
    int none = 0; // 모르는 번호 개수 (0의 개수)
    
    for (auto& num : win_nums) {
        auto it = find(lottos.begin(), lottos.end(), num);
        if (it != lottos.end()){
            hit++;
        }
    }
    
    for (auto& num : lottos) {
        if (num == 0) none++;
    }
    
    // 맞은 개수 + 모르는 번호의 개수 = 최대 순위
    int max_hit = hit + none; 
    
    // 맞은 개수 = 최소 순위
    int min_hit = hit; 
    
    // 최소로 맞은 숫자의 개수가 1 or 0 이라면 낙첨
    if (min_hit < 2) min_hit = 1;
    
    // 최대로 맞은 숫자의 개수가 0 이라면 낙첨
    if (max_hit == 0) max_hit = 1;
    
    // 7에서 빼준 이유는 (순위 + hit) = 7 이기 때문
    answer.push_back(7-max_hit);
    answer.push_back(7-min_hit);
    
    // [최고 순위, 최저 순위] 반환
    return answer;
}

 

 

[ 설명 ]

1. 입력으로 주어진 당첨 번호의 vector를 순회하면서 num이라는 지역 번수에 담아온다.

2. 1의 과정에서 받아온 num이라는 값이 있는지 find 함수를 통해서 lottos vector에서 찾는다.

3. 만약 값이 있다면 lottos.end() 가 아니기 때문에 조건을 통과하고 hit 변수에 1을 증가시킬 것이다.

4. 다음으로는 lottos 라는 vector를 순회하면서 단순하게 모르는 번호 즉, 0의 개수를 none라는 변수에 저장한다.

5. 예외처리를 통해 최대로 맞춘 번호의 수 (max_hit)과 최소로 맞춘 번호의 개수 (min_hit) 변수를 가지고 최고 순위와 최저 순위를 계산해준다.

6. 계산된 각 순위를 answer에 순서대로 push_back 한 후 결과를 출력한다.

 

반응형