빠르게 완료
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
- 당첨이 가능했던 최고 순위와 최저 순위를 벡터로 출력
[접근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++;
}

[접근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);'coding > algorithm' 카테고리의 다른 글
| [programmers] Lv.2 오픈채팅방(c++) (0) | 2022.04.18 |
|---|---|
| [programmers] Lv.2 문자열 압축(c++) (0) | 2022.04.15 |
| [programmers] Lv.1 숫자 문자열과 영단어(c++) (0) | 2022.03.08 |
| [programmers] Lv.1 신규 아이디 추천(c++) (0) | 2022.03.01 |
| [programmers] Lv.1 신고 결과 받기(c++) (0) | 2022.02.25 |
댓글