본문 바로가기
coding/algorithm

[programmers] Lv.1 로또의 최고 순위와 최저 순위(c++)

by 눈부신음표 2022. 2. 28.
728x90

빠르게 완료

for문 하나로 해결해서 만족스러움 :)

더보기
#include <bits/stdc++.h>

using namespace std;

vector<int> solution(vector<int> lottos, vector<int> win_nums) {
    sort(lottos.begin(), lottos.end());
    sort(win_nums.begin(), win_nums.end());

    int idx = 0, cnt = 0, same = 0;
    for(int i=0; i<6; i++){
        if(lottos[i] == 0){
            cnt++;
            continue;
        }
        while(lottos[i] > win_nums[idx])
            idx++;

        if(lottos[i] == win_nums[idx])
            same++;
    }

    vector<int> answer;
    answer.push_back(same == 0 && cnt == 0 ? 6 : 7-(same+cnt));
    answer.push_back(same == 0? 6 : 7-same);
    return answer;
}

문제 정리:

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

 

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

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

programmers.co.kr

input

  • vector<string> lottos : 찍은 로또 번호 (길이 6인 정수 배열)
  • vector<string> win_nums: 당첨 로또 번호 (길이 6인 정수 배열)

- 로또의 번호중 몇개가 지워져있다 -> 0으로 나타냄

- 1위 : 6개의 번호가 모두 일치

- 2위 : 5개의 번호가 모두 일치

...

- 5위 : 2개의 번호가 모두 일치

- 6위(낙첨) : 그 외

output

  • 당첨이 가능했던 최고 순위와 최저 순위를 벡터로 출력

 

728x90

[접근1]

lottos에 들어있는 숫자를 하나하나 win_nums에 있는지 확인하는것은 매우 비효율적이라 생각하였다.

하나의 for문으로 해결하고싶어서 우선 정렬을 했다.

 

sort(lottos.begin(), lottos.end());
sort(win_nums.begin(), win_nums.end());

[접근2]

3개의 변수를 선언하여 0으로 초기화했다.

idx는 win_nums에서 가리키고있는 원소의 인덱스이고, cnt는 0의 개수, same은 일치하는 숫자의 개수를 나타낸다.

lottos[i]가 0이면 cnt를 1증가시키고 다음 조건문들은 의미가 없기 때문에 continue를 사용하여 바로 다음으로 넘어간다.

lottos[i]가 win_nums[idx]보다 크면 idx를 증가시켜서 lottos[i]와 같은 숫자가 있는지 확인하고 same을 1 증가시킨다.

만약 idx를 증가시키다가 같아지지않고 lottos[i]가 win_nums[idx]보다 작다면 같은 숫자가 없다는것이므로 다음으로 넘어간다.

 

int idx = 0, cnt = 0, same = 0;
for(int i=0; i<6; i++){
    if(lottos[i] == 0){
        cnt++;
        continue;
    }
    while(lottos[i] > win_nums[idx])
        idx++;
        
    if(lottos[i] == win_nums[idx])
        same++;
}

for문 설명


[접근3]

만약 같은 숫자가 없고 0인 숫자도 없다면 맞은 최고 순위도 6위일 수밖에 없고

이외의 경우엔 최고 순위는 7-(same+cnt)임을 알 수 있다.

만약 같은 숫자가 없으면 가려진 숫자들도 다 틀렸다고 생각하여 최저 순위가 6위가 되고

이외의 경우엔 최저 순위가 7-same임을 알 수 있다.

 

vector<int> answer;
answer.push_back(same == 0 && cnt == 0 ? 6 : 7-(same+cnt));
answer.push_back(same == 0? 6 : 7-same);
728x90

댓글