DEV Community

Altencir Junior
Altencir Junior

Posted on

Resolvendo problemas no HackerRank: Separando meias por cores!

Olá, seja bem vindo a mais uma etapa do Resolvendo problemas no Hacker-Rank,nessa sessão iremos dividir meias que estão categorizadas dentro de um array de números. Cada número representa uma cor. Vejamos como separar isso.

Sales by Match -

O problema é direto e nos diz:"Determine quantos pares de meias com cores correspondentes existem." Logo após ele nos dá a sequência:

  • n = 7
  • arr = [1,2,1,2,1,3,2]

Conseguimos formar um par de cor 1(arr[1,1]),e um par de cor 2(arr[2,2]), sobrando [1,2,3] um de cada cor.

O código para resolver isso foi feito usando Reduce, da seguinte maneira:

function sockMerchant(n, ar) {
    // Write your code here
  const count = ar.reduce((acc, cur) => {
    acc[cur] = (acc[cur] || 0) + 1;
    return acc;
  }, {});

  const numbersPairs = Object.values(count).reduce((acc, cur) => {
    return acc + Math.floor(cur / 2);
  }, 0);

  return numberPairs;
}
Enter fullscreen mode Exit fullscreen mode

A primeira linha da função cria uma variável count e a inicializa como um objeto vazio. Isso é feito para armazenar a contagem de cada cor de meia presente no array ar. É usado o (acc[cur] ||0)+1 para verificar se a cor da meia já existe. Caso sim,adiciona 1 e caso não se cria um contador com início de valor 1.

Depois disso, a função Object.values é usada para obter um array com os valores dos contadores presentes no objeto count. Esses valores são passados como primeiro argumento para a função reduce seguinte que recebe os mesmos dois parâmetros que a função reduce anterior.

A função passada como primeiro argumento para reduce soma o número de pares de meias encontrados para cada cor de meia presente em count. Isso é feito dividindo o valor do contador por 2, arredondando para baixo com Math.floor, e somando o resultado ao acumulador acc. O resultado final é retornado no final da função reduce.

Por fim, o resultado final é retornado pela função sockMerchant.

Com isso concluímos mais um episódio, e nos vemos na próxima!!!

Top comments (0)