접근 방법
- 정확히 맞은 개수와 0의 개수를 각각 체크
- 정확히 맞은 개수는 최저 순위, 0의 개수를 합쳐 최고 순위 계산
#include <string>
#include <vector>
#include <set>
using namespace std;
int ranking(int n){
if(n < 2) return 6;
else return 7 - n;
}
vector<int> solution(vector<int> lottos, vector<int> win_nums) {
vector<int> answer;
set<int> match;
int numZero = 0;
int matchNum = 0;
match.insert(win_nums.begin(), win_nums.end());
for(int i = 0; i < lottos.size(); i++){
if(lottos[i]){
auto it = match.insert(lottos[i]);
if(!it.second) matchNum++;
}
else numZero++;
}
answer.push_back(ranking(matchNum + numZero));
answer.push_back(ranking(matchNum));
return answer;
}
def solution(lottos, win_nums):
answer = []
temp = [x for x in lottos if x in win_nums]
n = len(temp) + lottos.count(0)
if n < 2:
answer.append(6)
else:
answer.append(7 - n)
if len(temp) < 2:
answer.append(6)
else:
answer.append(7 - len(temp))
return answer
지금 C++로 푼 풀이를 다시 보니 순위 구하는 부분을 함수로 처리하는게 더 깔끔해보이는 것 같다.
반복된 행동을 할 때는 함수를 만들어 쓰기!!
def ranking(n):
if n < 2:
return 6
else:
return 7 - n
def solution(lottos, win_nums):
answer = []
temp = [x for x in lottos if x in win_nums]
n = len(temp) + lottos.count(0)
answer.append(ranking(n))
answer.append(ranking(len(temp)))
return answer
def solution(lottos, win_nums):
rank=[6,6,5,4,3,2,1]
cnt_0 = lottos.count(0)
ans = 0
for x in win_nums:
if x in lottos:
ans += 1
return rank[cnt_0 + ans],rank[ans]
등수를 if문이 아니라 리스트로 써놓고 인덱스를 올려가며 순위를 찾은 방법이 신선한 것 같다.
큰 틀은 비슷하지만 구체적인 구현 방법에서는 이렇게 사람마다 달라질 수 있다는 것을 다시한번 깨닫는다.