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

문제 링크

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

분석

lottos에서 0의 개수를 세야합니다.
0은 로또 번호를 가장 많이 맞춘 경우의 값이 됩니다.

0을 전부 틀린 숫자로 가정하고, 맞춘 숫자를 구해 가장 적게 맞춘 경우의 값을 구해야합니다.

가장 많이 맞춘 경우의 값과 가장 적게 맞춘 경우의 값으로 순위를 구합니다.

풀이

#include <vector>

using namespace std;

vector<int> solution(vector<int> lottos, vector<int> win_nums) {
    vector<int> answer;
        
    int high = 0;
    int low = 0;
    
    for (int i = 0; i < lottos.size(); ++i)
    {
        if (lottos[i] == 0)
        {
            ++high;
            continue;
        }
        
        for (int j = 0; j < win_nums.size(); ++j)
        {
            if (lottos[i] == win_nums[j])
            {
                ++high;
                ++low;
                break;
            }   
        }
    }
    
    high = (high > 1) ? high : 1;
    low = (low > 1) ? low : 1;
    
    answer.push_back(7 - high);
    answer.push_back(7 - low);
    
    return answer;
}

high는 로또 번호를 가장 많이 맞춘 경우의 값을 저장합니다.
low는 로또 번호를 가장 적게 맞춘 경우의 값을 저장합니다.

lottos를 순회해 당첨 번호를 확인합니다.
구매한 로또의 번호가 0인 경우 로또 번호를 가장 많이 맞춘 경우(high)의 값을 1 증가시킵니다.
구매한 로또의 번호가 당첨 번호인 경우 모든 경우의 값을 1씩 증가시킵니다.

반복문이 끝난 후 다음과 같습니다.
로또 번호를 가장 많이 맞춘 경우와 가장 적게 맞춘 경우의 값으로 순위를 계산합니다.
1개 이하로 맞춘 경우 6위이므로, 6의 값을 가질 수 있도록 변경하고, 순위를 구해 반환합니다.

성능 요약

시간 복잡도는 $O(1)$의 시간 복잡도를 가집니다.

  • lottos를 순회하는 반복문($O(6) \approx O(1)$)
  • win_nums를 순회하며 당첨 번호를 비교하는 반복문 ($O(6) \approx O(1)$)
  • lottoswin_nums를 순회하는 중첩 반복분이므로 최악의 경우 ($6 \times 6 = 36$)
  • $O(36) \approx O(1)$

공간 복잡도는 고정된 크기의 상수 공간을 사용하기 때문에 $O(1)$입니다.

테스트 1 〉 통과 (0.01ms, 4.2MB)
테스트 2 〉 통과 (0.01ms, 4.16MB)
테스트 3 〉 통과 (0.01ms, 4.19MB)
테스트 4 〉 통과 (0.01ms, 4.27MB)
테스트 5 〉 통과 (0.01ms, 3.67MB)
테스트 6 〉 통과 (0.01ms, 4.16MB)
테스트 7 〉 통과 (0.01ms, 4.18MB)
테스트 8 〉 통과 (0.01ms, 3.66MB)
테스트 9 〉 통과 (0.01ms, 3.66MB)
테스트 10 〉 통과 (0.01ms, 4.02MB)
테스트 11 〉 통과 (0.01ms, 4.2MB)
테스트 12 〉 통과 (0.01ms, 4.2MB)
테스트 13 〉 통과 (0.01ms, 4.13MB)
테스트 14 〉 통과 (0.01ms, 3.74MB)
테스트 15 〉 통과 (0.01ms, 4.12MB)

Programmers 카테고리 내 다른 글 보러가기

댓글남기기