Codewars 이용자 솔루션 모음

Counting Duplicates - 앞 문자열과 마지막 문자열을 비교

link 배열에서 2번이상의 문자가 들어있는 문자의 수

@glalev, @ChungGor, @Pradeep Reddy, @larokey, @sahalatobing, @ellie-grace's Solution

function duplicateCount(text){
  return text.toLowerCase().split('').filter(function(val, i, arr){
    return arr.indexOf(val) !== i && arr.lastIndexOf(val) === i;
  }).length;
}

filter를 통해 2번이상 들어 있는 문자만의 배열을 새롭게 만드는데, arr.indexOf(val) !== iarr.lastIndexOf(val) === i;를 통해 맨 마지막 문자열과 앞의 문자열이 중복된게 있는지 체크 해준다.

DubstepDubstep - 특정글자 잘라내기

link WUB라는 글자가 나오면 삭제하고 나머지 글자 사이엔 하나의 공백만 넣는다.

@VictorArias, @Smoggy, @etselp, @Firedrake969, @Psycho, @cmac2992's Solution

function songDecoder(song){
  return song.split('WUB').filter(Boolean).join(' ');
}

split를 사용하여 'WUB'를 제거하는 효율적인 방법이 놀랍다. 또한 split 이후 filter로 배열의 원소가 "" 공백인 곳을 잡아준다. 매우 효율적으로만 구성된 코드다.

Rectangle into Squares - 정사각형의 개수 구하기

link 인자로 가로(a)와 세로값(b)을 받으며 가장 큰 정사각형부터 시작하여 총 몇개의 정사각형이 나올 수 있는지에 관한 문제이다. 같은 자리에 작은 정사각형은 세지 않는다.

@sulkowski's Solution

function sqInRect(a, b, initial = true){
  if (a === b) { return initial ? null : [a] }  
  const min = Math.min(a, b)
  const max = Math.max(a, b)

  return [min, ...sqInRect(max - min, min, false)]
}

return을 본인으로 하여 재귀함수가 되지만 신선한건 재귀값들을 배열로 만들었다는 점이다.

a와 b가 같아질때까지 계속 재귀함수가 실행되고 return []안에는 min값이 계속쌓이고 마지막 a === b같아지는 순간에는 [a]가 리턴되는데 이 값은 ...으로 destructuring되어 맨처음 시작했던 함수에서 최종적으로 모든 min값이 return되는 정말 재밌고 신기한 구조쓰

Snail

link 인자로는 배열을 받는데 nxn 의 정사각형의 각각 숫자를 배열로 받는다. 배열안에 배열로 구성되어 있다.

array = [[1,2,3],
         [4,5,6],
         [7,8,9]]

//return 값 
//snail(array) #=> [1,2,3,6,9,8,7,4,5]

@altrubypirate, @xiaright, @Unihedron, @YGYOOO, @link., @theyellowkang's Solution

snail = function(array) {
  var result;
  while (array.length) {
    // Steal the first row.
    result = (result ? result.concat(array.shift()) : array.shift());
    // Steal the right items.
    for (var i = 0; i < array.length; i++)
      result.push(array[i].pop());
    // Steal the bottom row.
    result = result.concat((array.pop() || []).reverse());
    // Steal the left items.
    for (var i = array.length - 1; i >= 0; i--)
      result.push(array[i].shift());
  }
  return result;
}

result에 들어간 요소들은 처음받은 array에서 제거된다. 정확하게 정사각형이 도는 순환구조대로 짜져있으며 array는 계속 수정되므로 length가 없을때는 result가 return된다.

By 3, or not by 3

type이 string인 숫자를 인자로 받아 총합이 3으로 나뉘어 지는지에 대한 알고리즘

Voile's Solution

function divisibleByThree(str){
  return [...str].reduce((s,d)=>+d+s,0)%3===0;
}

str을 split('')을 사용하지 않고 배열로 만든점이 신선하다. 또한 아직 문자열을 +d+s로 하여(순서를 바꿈) 숫자로 바꿔버림.

Sum of Digits / Digital Root

link 인자로 받은 숫자가 계속 더하여 한자리가 되면 리턴한다!

digital_root(16)
=> 1 + 6
=> 7

Balkoth, fidelius, FunGuy, rojohnmico, Mattordrag, Binayre 's Solution

function digital_root(n) {
  return (n - 1) % 9 + 1;
}

헉 무조건 답이 나오는데 이유는 모르겠다. 헉

Once bubble sort

hencethus' solution

const bubblesortOnce = function([h, ...t]) {
  return t.reduce(function(acc, v) {
    if (h < v) [h, v] = [v, h];
    return [...acc, v];
  }, []).concat(h || []);
};

하나씩 살펴보자.

if (h < v) [h, v] = [v, h];

h < v보다 클경우. v = h가 되고 h = v가 된다.

return [...acc, v];

return은 큰 값 h는 빼고 한다.

concat(h || []);

이부분에서 마지막 []은 왜하는지 모르겠다.

Last updated

Was this helpful?