나만의 작은 도서관

문제 77484. 로또의 최고 순위와 최저 순위 본문

프로그래머스 문제풀이/코드카타

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

pledge24 2024. 6. 14. 09:58

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

난이도 : Lv.1

 

문제 요약 설명

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 

순위 당첨내용
1 6개 일치
2 5개 일치
3 4개 일치
4 3개 일치
5 2개 일치
6 낙첨

6개의 당첨번호 중 일부 번호를 알 수 없을 때(0으로 표기), 최저 순위와 최고 순위를 출력하는 프로그램을 작성하시오.

입력

  • 로또 번호를 담은 배열 lottos와 당첨 번호를 담은 배열 win_nums이 주어집니다. 

 

입력 제한

  • lottos는 길이가 6인 정수 배열이며, 1이상 45이하의 서로다른 정수와 0이 저장되어 있다. 
  • lottos는 정렬을 보장하지 않는다.
  • win_nums는 길이가 6인 정수 배열이며, 1이상 45이하의 서로다른 정수가 저장되어 있다.
  • win_nums는 정렬을 보장하지 않는다.

입력 예제

// input
[44, 1, 0, 0, 31, 25] // lottos
[31, 10, 45, 1, 6, 19] // win_nums

// ans
[3, 5]

 

풀이 방식

lottos배열에 포함된 숫자가 0이거나 0이 아닌 경우로 구분해서 다음과 같이 실행한다.

  • 로또 번호가 0인경우: 0의 개수를 저장하는 zero_n을 1 증가시킨다.
  • 로또 번호가 0이 아닌 경우: 해당 번호가 win_nums에 존재하는 지 찾고, 적중했다면 적중 횟수를 저장하는 cnt를 1 증가시킨다.

로또 번호는 각 번호가 서로 겹치지 않으니 최저 순위는 zero_n만큼 빗나가고 최고 순위는 zero_n만큼 적중했다고 결정할 수 있다. 

최종적으로, zero_n + cnt의 값이 적중 횟수가 되며, 이에 따른 결과를 출력한다.

정답 코드 

더보기
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> lottos, vector<int> win_nums) {
    vector<int> answer;
    vector<bool> visited(6);
    
    int cnt = 0;
    int zero_n = 0;
    for(int elem : lottos){
        if(elem == 0){
            zero_n++;
            continue;
        }
        
        if(find(win_nums.begin(), win_nums.end(), elem) != win_nums.end()) cnt++;
    }
    
    int min_rank = cnt >= 2 ? 7 - cnt : 6;
    int max_rank = (cnt + zero_n) >= 2 ? 7 - (cnt + zero_n) : 6;
    answer = {max_rank, min_rank};
    return answer;
}

'프로그래머스 문제풀이 > 코드카타' 카테고리의 다른 글

문제 140108 문자열 나누기  (0) 2024.06.18
문제 42862. 체육복  (0) 2024.06.17
문제 131128. 숫자 짝꿍  (0) 2024.06.16
문제 133499. 옹알이 (2)  (1) 2024.06.15
문제 42840. 모의고사  (0) 2024.06.10