level의 다소 간단한 문제이다.
내가 푼것은 아래와 같은데... 일단 평범한 답변이니 패스하고, 다른 문제 풀이에서 좋아요를 많이 받은 코드를 다시 살펴볼까한다.
[처음으로 푼거]
using System;
public class Solution {
public int[] solution(int[] lottos, int[] win_nums)
{
int rightCount = 0;
int errorNumber = 0;
int maxRight = 0;
int minRight = 0;
for (int i = 0; i < lottos.Length; i++)
{
if (lottos[i] == 0) errorNumber++;
for (int j = 0; j < win_nums.Length; j++)
{
if (lottos[i] == win_nums[j])
{
rightCount++;
}
}
}
maxRight = CalWinLevel(rightCount + errorNumber);
minRight = CalWinLevel(rightCount);
int[] answer = new int[] {maxRight, minRight};
return answer;
}
int CalWinLevel(int rightCount){
int cal = 7 - rightCount;
if(cal > 6)
cal = 6;
return cal;
}
}
[다른 분이 푼 코드]
using System;
using System.Linq;
public class Solution
{
public int[] solution(int[] lottos, int[] win_nums)
{
int winCount = lottos.Intersect(win_nums).Count();
int loseCount = lottos.Where((number) => number != 0).Count() - winCount;
int[] answer = new int[] {WinCountToRank(6-loseCount), WinCountToRank(winCount)};
return answer;
}
public int WinCountToRank(int count)
{
if (count <= 1)
{
return 6;
}
return 7-count;
}
}
Linq를 사용한 것인데, 교집합을 추려내는 Intersect와, Where()를 통한 조건문을 사용했다. 위와같이 내가 처음에 썼던 로직에 Linq를 적용하면 아래와 같이 적용 할 수 있다.
using System;
using System.Linq;
public class Solution {
public int[] solution(int[] lottos, int[] win_nums)
{
int rightCount = lottos.Intersect(win_nums).Count();
int errorNumber = lottos.Count(x => x== 0);
int maxRight = CalWinLevel(rightCount + errorNumber);
int minRight = CalWinLevel(rightCount);
int[] answer = new int[] {maxRight, minRight};
return answer;
}
int CalWinLevel(int rightCount){
int cal = 7 - rightCount;
if(cal > 6) cal = 6;
return cal;
}
}
하지만 Linq로 가독성이 좋아진만큼 계산시간은 더 오래 걸린다.