2021 데브매칭 백엔드 상반기 문제를 풀어봤다
※그냥.. 최적이고 간에 해결하는것에 의의를 둔 풀이임
늘 그렇듯 1번 문제부터 고전했다.,
고전하는 중 질문하기 페이지를 구경하다가 문제에 대해 화가난 유저도 보았다
문제 요약
민우가 구입한 로또 번호 6개 중 동생이 랜덤하게 덧칠을 해서 알수없는게 n개 있는데
이 n개가 로또 정답일 때, 정답이 아닐 때 를 각각 구하면 됨
처음에 생각했던 방식
default_num, : 민우의 로또 번호 중 정답 로또 번호와 일치하는 것
ran_num : 민우의 번호 중 0 인 것
for문을 돌려 lottos(민우 로또 번호), win_nums(정답 로또 번호)를 비교하여 위의 변수에 ++; 해줌
민우와 정답 로또번호를 모두 비교해서 ran_num, default_num을 구한 뒤
미리 지정해둔 정답과 등수의 map을 이용해
answer에 각각 map[default_num+ran_num]과, map[default_num]을 삽입하도록 하였는데
테스트 케이스에서 계속 3개만 맞고 나머지 11개정도를 죄다 틀려버리는 사태가 발생해서
중간 중간 출력을 해보며 확인한 결과,
로또 번호를 비교하는 반복문을 수행할 때, 이미 0(ran_num)을 찾은 뒤에 또다시 같은 값을 확인해버리는 상황이 발생해서 문제가 생기는걸 확인함
해결법으로 2가지 정도를 생각해봤는데
1) 각각의 벡터를 정렬 시킨다음, 위의 방법처럼 for문으로 비교를 하는것과
2) 민우의 로또 번호에서 0을 찾은 다음, 6에서 그 개수를 뺀 나머지만큼만 반복문을 돌려서 수를 비교하는것 중
후자를 선택했다
※ 1번이 맞는 방법이 아닐수도 있다
map에 지정해둔 등수와 개수
맞힌 개수 |
등수 |
6 |
1 |
5 |
2 |
4 |
3 |
3 |
4 |
2 |
5 |
1 |
6 |
0 |
6 |
착오를 거쳐 수정한 방법
민우의 로또 번호 중 0의 갯수를 미리 모두 찾아 ran_num에 저장
그리고 민우의 번호인 lottos 벡터에서 0을 모두 지워버린 다음
그만큼 반복을 덜하도록 for문을 수정해주었다
#include<bits/stdc++.h>
using namespace std;
vector<int> solution(vector<int> lottos, vector<int> win_nums) {
vector<int> answer;
//최저 값, 랜덤 값 확인
//default인 값 만큼은 갯수를 맞힐수있다
//랜덤 값 만큼 디폴트 기준 위아래로 범위가 넓어짐
int default_num = 0;
int ran_num = count(lottos.begin(), lottos.end(), 0);
cout << "0의 값 : " << ran_num <<"\n";
remove(lottos.begin(), lottos.end(), 0);
//로또 번호 총 6개에서 민우 번호 중 0개인 만큼 제외하여
//비교할 for문에 사용
int len = lottos.size();
int len1 = len-ran_num;
int len2 = win_nums.size();
//로또 정답과 민우 번호 비교에 사용
int tmp;
for(int i=0; i<len1; i++){
tmp = lottos[i];
cout <<"\n tmp 값 : " << tmp << "\n";
for(int j=0; j<len2; j++){
if(tmp == win_nums[j]){
default_num++;
cout <<"값이 같음, default 값 : " <<+ default_num << "\n";
break;
}
}
}
map<int,int> m;
//맞은 갯수, 등수
m[6] = 1;
m[5] = 2;
m[4] = 3;
m[3] = 4;
m[2] = 5;
m[1] = 6;
m[0] = 6;
answer.push_back(m[default_num+ran_num]);
answer.push_back(m[default_num]);
/* 맞게 들어갔는지 확인차 출력
for(int i=0; i<2; i++){
cout <<answer[i] << ", \n";
}*/
return answer;
}
최고 순위 : default_num + ran_num
> 맞은 로또 번호에 ran_num(0)이 추가로 정답일 경우
최저 순위 : default_num
> ran_num(0)이 로또 정답이 아닐 경우
map의 value 값은 중복이 가능하므로
m[1]=6, m[0] =6을 넣어줌
https://programmers.co.kr/learn/courses/30/lessons/77484?language=cpp
https://programmers.co.kr/learn/challenges