77484. 로또의 최고 순위와 최저 순위

2022-05-01
프로그래머스 77484번 풀이

이 글은 Obsidian에서 마이그레이션되었으며, 그 과정에서 AI의 도움을 받았습니다. 오류나 누락된 내용이 있다면 댓글로 알려주세요!

문제

코딩테스트 연습 - 로또의 최고 순위와 최저 순위 | 프로그래머스 스쿨

풀이

아이디어

일부 번호를 알아볼 수 없게 된 로또 번호 목록을 입력받고, (알아볼 수 없는 일부 번호는 0으로 표시되어 있다.) 당첨 번호를 받았을 때 받을 수 있는 최고 순위 (그러니까 최대로 많은 숫자를 일치시킬 수 있는 경우) 와 최저 순위를 구하는 문제이다.

(1) 일단 0의 개수를 구해야 한다. 이 녀석은 조커와 비슷한 느낌으로 어떤 숫자도 될 수 있다. (zero 변수)

(2) 그리고 lottos를 돌면서 현재 win_nums에 해당 숫자가 있는지 확인하고 (feat. find 함수) 숫자가 있으면 yes 변수를 증가시키고, 없으면 no 변수를 증가시킨다.

(3) 가장 높은 순위를 받을 수 있는 경우는 zero에 해당하는 숫자들이 모두 win_nums에 있는 경우기 때문에 yes+zero개의 숫자가 일치하는 순위가 될 것이고 가장 낮은 순위를 받을 수 있는 경우는 반대로 zero에 해당하는 숫자들이 모두 win_nums에 없는 경우일 것이기 때문에 yes개의 숫자가 모두 일치하는 순위일 것이다.

(4) 그 숫자대로 순위를 나누어서 answer 벡터에 넣어주면 문제 해결 완료!

코드

#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;
}