프로그래밍/프로그래머스

Lv1_[로또의 최고 순위와 최저 순위, C++] 알고리즘 정리 - 프로그래머스

워킹독 2022. 11. 16. 06:53
728x90

문제 내용, 조건, 예시는 프로그래머스 사이트 참조


이번 문제의 풀어야 할 점은 "일치하는 숫자가 몇개"인지 입니다.
일치하는 숫자는 당연하게 최저 순위가 될 것입니다.
그러면 최고 순위는 (일치하는 숫자 + 낙서로 가려진 숫자의 개수)가 됩니다.

문제 해결방법은 찾았으니 얼마나 효율적으로 찾아낼 수 있느냐만 남아있다.

두 개의 벡터를 비교하는 방법 고민해보면
 1) 이중 반복문으로 비교
 2) 벡터 정렬 후 index를 가지고 비교 (Lv1. 숫자 짝꿍에서 사용했던 방식; https://workingdog.tistory.com/38)
 3) set을 활용해서 중복인 요소 찾아내기 (삽입 연산 insert)

위의 3가지 시간복잡도를 살펴보면
 1) O(n*n)  (이중 반복문)
 2) O(nlogn + n) (sort + 반복문)
 3) O(n) (불균형 트리 삽입)
으로 볼 수가 있는데 문제에서 주어진 벡터는 사이즈 6으로 작기 때문에 큰 시간차는 없을 것으로 판단됩니다.

그래도 효율적으로 구성하는게 후에 유지보수를 위해는 더 좋죠

1) vector<int> win_nums에는 로또 당첨 번호로 중복된 값이 존재하지 않기 때문에 우선적으로 set<int> s에 삽입해줌.
    (vector<int> lottos에는 중복 값 '0'이 존재할 수 있음)
2) 먼저 set에 삽입된 win_nums와 lottos를 비교하며 중복된 값과 '0'의 값의 개수를 추출하면 완료.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <string>
#include <vector>
#include <set>
 
using namespace std;
 
vector<int> solution(vector<int> lottos, vector<int> win_nums) {
    vector<int> answer;
 
    // 1) 일치하는 숫자 찾기
    // 2) 0의 개수 찾기
    // 3) (일치하는 개수 == 최저 순위), (최저 순의 + 0의 개수 = 최고 순위)
    int count_0 = 0;
    int count_etc = 0;
    vector<int> score = { 6654321 };
    set<int> s(win_nums.begin(), win_nums.end());
 
    for (auto item : lottos) {
        if(item == 0) {
            count_0++;
        } else {
            auto ret = s.insert(item);
            if(ret.second == false) {
                // 중복
                count_etc++;
            }
        }
    }
 
    answer.push_back(score[count_etc + count_0]);
    answer.push_back(score[count_etc]);
 
    return answer;
}
cs

속도는 아주 좋다

↓↓↓↓↓↓ 유익했다면 하트 뿅 ♥ ↓↓↓↓↓↓

728x90
반응형