양말 상인 코드 챌린지 해결
2150 단어 codechallengehackerrank
예를 들어, 색상이 ar = [1, 2, 1, 2, 1, 3, 2]인 n = 7개의 양말이 있습니다. 색상 1과 색상 2가 각각 한 켤레 있습니다. 각 색상에 하나씩 3개의 이상한 양말이 남아 있습니다. 쌍의 수는 2입니다.
더미 n에 있는 양말의 수와 각 양말의 색상 배열이 주어지면 몇 켤레가 있습니까?
첫 번째 솔루션:
static int sockMerchant(int n, int[] ar) {
int pairs = 0;
HashSet<int> set = new HashSet<int>();
foreach (int i in ar)
{
if (set.Contains(i)) continue;
int[] matchedItems = Array.FindAll(ar, x => i == x);
int occurrencies = matchedItems.Length;
if (occurrencies > 1)
pairs += ((occurrencies - (occurrencies % 2)) / 2);
set.Add(i);
}
return pairs;
}
두 번째 솔루션:
LINQ를 사용하여 첫 번째 솔루션을 최적화하고 이 또 다른 솔루션을 생각해 낸 at에 첫 번째 솔루션을 표시한 후:
static int sockMerchant(int[] ar)
{
int pairs = 0;
int[] colorsCount = ar.GroupBy(color => color).
Select(color => color.Count()).
ToArray();
foreach (int count in colorsCount)
{
pairs += ((count - (count % 2)) / 2);
}
return pairs;
}
세 번째 솔루션:
보시다시피 두 솔루션 모두 O(N^2)의 복잡성을 가지며 이는 성능에 좋지 않습니다. 그래서 웹에서 조금 더 검색하여 일부 Slack 그룹에 대한 도움을 요청했고 O(N)의 복잡성으로 제안한 다음과 같은 솔루션을 받았습니다.
static int SockMerchant(int[] ar)
{
var socksPairs = new Dictionary<int, int>();
int nSocks = 0;
for (var i = 0; i < ar.Length; i++) {
var current = ar[i];
if (socksPairs.ContainsKey(current)) {
socksPairs[current]++;
if (socksPairs[current] == 2) {
nSocks++;
socksPairs[current] = 0;
}
} else {
socksPairs[current] = 1;
}
}
return nSocks;
}
이 양말 상인 챌린지는 HackerRank의 일부입니다.
Reference
이 문제에 관하여(양말 상인 코드 챌린지 해결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rezende79/sock-merchant-code-challenge-solved-45hf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)