Sister Nosilv story

[TIL 20th] 프로그래머스 : 로또의 최고 순위와 최저 순위

by 노실언니

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/77484

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

깃허브 풀이 링크

 

Algorithm_Cpp_SQL/프로그래머스/1/77484. 로또의 최고 순위와 최저 순위 at main · learner-nosilv/Algor

This repository contains the problems and code that I have successfully solved. This repository is automatically pushed by LeetHub and BaekjoonHub. - learner-nosilv/Algorithm_Cpp_SQL

github.com


간단히 말하면, 내 로또 종이 일부가 낙서때문에 보이지 않는 상황에서

낙서에 가려진 번호를 제외한 내 로또번호랑 실제 당첨번호를 비교해서, 나의 최고 등수와 최저 등수를 가늠하라는 문제이다.

 

일단, 방향성을 잡자면 ; 소팅, 벡터의 원소 삭제는 pop_back()뿐이라는 점을 염두하고 코드를 짰다.

  - 소팅을 한 후에 비교를 하면 비교 횟수가 줄어들 듯했다.

  - 번호가 0이냐? 이런 비교를 하는 것도 아까워서 민우 번호 벡터에 있는 0(낙서로 지워진 번호)은 미리 삭제를 하려는데 벡터는 맨 뒤 원소만 지울 수 있어서 소팅을 내림차순으로 했다. pop_front()는 없는 듯

( 큐도 생각해봤는데, 입력될 때의 자료형이 고정되어 있어서 어쩔수없다 ! )

1. 내림차순 정렬하고 값이 0인 원소 삭제하기(낙서로 지워진 번호 갯수 카운팅)

정렬 후, 값이 0인 원소는 삭제해버림

 

2. 내 번호와 로또번호를 비교하여 맞춘 갯수 카운팅

소팅을 했기 때문에 내 번호와 로또 번호를 비교해서 동일한 번호를 찾는 과정은 간편해졌다.

이중for문을 쓰지 않아도 되고 말이다.

이중for문의 일반적인 코드
비교횟수를 줄이고 이중for문을 제거했다.

3. 낙서로 지워진 번호 갯수와 맞춘 갯수를 사용하여 최고등수/최저등수 계산

1순위+6개번호 = 2순위+5개번호 = ... = 5순위+2개번호 = 7개로 동일하다. 그걸 이용해서 등수를 계산했다.

vector<int> answer;
    answer.push_back( (empty+match>1 ? 7-(empty+match) : 6) );  // 최고등수
    answer.push_back( (match>1 ? 7-(match) : 6) );              // 최저등수

풀 코드

레벨 1 짜리 문제이기도 하고, 끽해봤자 6개번호라 대충해도 되는데 다른 방법으로 풀어보게 되었다. 

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

using namespace std;

vector<int> solution(vector<int> lottos, vector<int> win_nums) {
    int empty=0;    // 빈자리
    
    // 내림차순 정렬
    sort(lottos.rbegin(), lottos.rend());
    sort(win_nums.rbegin(), win_nums.rend());

    while(!lottos.empty() && lottos.back()==0) {
        lottos.pop_back();
        empty++;
    }
    
    // 현재 맞춘 갯수 카운팅
    int match=0;     // 맞춘갯수
    int l=0;
    int w=0;
    while(l<lottos.size() && w<win_nums.size()){
        if(lottos[l]==win_nums[w]) { match++; l++; w++; }
        else if(lottos[l]<win_nums[w]) w++;
        else l++;
    }
    
    vector<int> answer;
    answer.push_back( (empty+match>1 ? 7-(empty+match) : 6) );  // 최고등수
    answer.push_back( (match>1 ? 7-(match) : 6) );              // 최저등수
    
    return answer;
}
반응형

블로그의 정보

노력하는 실버티어

노실언니

활동하기