Fibonacci, Tribonacci and friends ( 6 kyu )

문제

If you have completed the Tribonacci sequence kata, you would know by now that mister Fibonacci has at least a bigger brother. If not, give it a quick look to get how things work.

Well, time to expand the family a little more: think of a Quadribonacci starting with a signature of 4 elements and each following element is the sum of the 4 previous, a Pentabonacci (well Cinquebonacci would probably sound a bit more italian, but it would also sound really awful) with a signature of 5 elements and each following element is the sum of the 5 previous, and so on.

Well, guess what? You have to build a Xbonacci function that takes a signature of X elements - and remember each next element is the sum of the last X elements - and returns the first n elements of the so seeded sequence.

xbonacci {1,1,1,1} 10 = {1,1,1,1,4,7,13,25,49,94}
xbonacci {0,0,0,0,1} 10 = {0,0,0,0,1,1,2,4,8,16}
xbonacci {1,0,0,0,0,0,1} 10 = {1,0,0,0,0,0,1,2,3,6}
xbonacci {1,1} produces the Fibonacci sequence

피보나치를 확장시켜 주어진 배열의 n번째 항까지 구해 리턴하는 문제

풀이

function Xbonacci(signature,n){
  let arr = signature.slice(), sum;
  for ( let i = 0; i < n-signature.length; i++ ) {
    sum = 0;
    for ( let j = i; j < i+signature.length; j++ ) {
      sum += arr[j]
    }
    arr.push(sum)
  }
  return arr.slice(0, n);
}

주어진 기본 배열을 복사해 다음 항은 이전 항들의 합으로 구해지도록 함

다른 사람의 풀이

const Xbonacci = (sig, n) => {
  let len = sig.length;
  for (let i = len; i < n; i++) 
    sig[i] = sig.slice(i - len).reduce((a, b) => a + b);
  return sig.slice(0, n);
}]

reduce를 사용해 이전항들의 합을 다음 항에 넣어주는 방법


'자료구조, 알고리즘 > Codewars 문제' 카테고리의 다른 글

Simple reversed parenthesis ( 6 kyu )  (0) 2018.01.09
Array Deep Count ( 6 kyu )  (0) 2017.12.27
Fibonacci, Tribonacci and friends ( 6 kyu )  (0) 2017.12.23
What is the growth? ( 6 kyu )  (0) 2017.12.22
Dashatize it ( 6 kyu )  (0) 2017.12.20
String average ( 6 kyu )  (0) 2017.12.19

What is the growth? ( 6 kyu )

문제

Write the function getGrowth(), which accepts an arbitrary number of comma separated integers and returns the difference between each subsequent and previous number in the series, as a string.

The function must return a string value where each “growth instance” is separated by a comma followed by a space character.

Example 1:

getGrowth(1, 2, 3)  // returns the string: "1 (+0, +0%), 2 (+1, +100%), 3 (+1, +50%)"

배열이 들어오면 이전값과 비교해서 변화를 적어 리턴하는 문제

풀이

function getGrowth(...args){
  let result = `${args[0]} (+0, +0%), `;
  for ( let i = 1; i < args.length; i++ ) {
    if ( args[i]-args[i-1] >= 0 ) {
      result += `${args[i]} (+${args[i]-args[i-1]}, +${Math.round((args[i]-args[i-1])/args[i-1]*100)}%), `
    } else {
      result += `${args[i]} (${args[i]-args[i-1]}, ${Math.round((args[i]-args[i-1])/args[i-1]*100)}%), `
    }
  }
  return result.slice(0, result.length-2);
}

그냥 써져있는대로 맞춰 씀..

다른 사람의 풀이

비슷함


'자료구조, 알고리즘 > Codewars 문제' 카테고리의 다른 글

Array Deep Count ( 6 kyu )  (0) 2017.12.27
Fibonacci, Tribonacci and friends ( 6 kyu )  (0) 2017.12.23
What is the growth? ( 6 kyu )  (0) 2017.12.22
Dashatize it ( 6 kyu )  (0) 2017.12.20
String average ( 6 kyu )  (0) 2017.12.19
Array Helper ( 6 kyu )  (0) 2017.12.19

Dashatize it ( 6 kyu )

문제

Given a number, return a string with dash’-‘marks before and after each odd integer, but do not begin or end the string with a dash mark.

Ex:

dashatize(274) -> '2-7-4'
dashatize(6815) -> '68-1-5'

홀수는 앞뒤로 대시를 붙여 리턴하는 문제

풀이

function dashatize(num) {
  let str = num.toString();
  let result = '';
  for ( let i = 0; i < str.length; i++ ) {
    str[i] % 2 === 1 ? result += `-${str[i]}-` : result += str[i];
  }
  while ( result[0] === '-' ) {
    result = result.slice(1)
  }
  while ( result[result.length-1] === '-' ) {
    result = result.slice(0, result.length-1);
  }
  return result.replace(/--/g, '-');
};

문자열로 변환 후 홀수인 경우에 대시를 앞뒤로 붙이고 마지막에 앞뒤를 자르고, 두개인 경우를 한개로 바꿔주고 리턴

다른 사람의 풀이

function dashatize(num) {
  return String(num)
    .replace(/([13579])/g, "-$1-")
    .replace(/--+/g, "-")
    .replace(/(^-|-$)/g, "")
}

신기한 정규식


'자료구조, 알고리즘 > Codewars 문제' 카테고리의 다른 글

Fibonacci, Tribonacci and friends ( 6 kyu )  (0) 2017.12.23
What is the growth? ( 6 kyu )  (0) 2017.12.22
Dashatize it ( 6 kyu )  (0) 2017.12.20
String average ( 6 kyu )  (0) 2017.12.19
Array Helper ( 6 kyu )  (0) 2017.12.19
Simple Fun #290: Sum Of Threes ( 6 kyu )  (0) 2017.12.18

String average ( 6 kyu )

문제

You are given a string of numbers between 0-9. Find the average of these numbers and return it as a floored whole number (ie: no decimal places) written out as a string. Eg:

“zero nine five two” -> “four”

If the string is empty or includes a number greater than 9, return “n/a”

문자로 써져있는 숫자의 평균을 문자로 리턴하는 문제

풀이

function averageString(str) {
  const num = ['zero', 'one','two','three','four','five','six','seven','eight','nine'];
  const arr = str.split(' ');
  let result = 0;
  for ( let i = 0; i < arr.length; i++ ) {
    if ( num.indexOf(arr[i]) === -1 ) return 'n/a';
    result += num.indexOf(arr[i]);
  }
  return num[parseInt(result/arr.length)];
}

num에 문자를 넣고 indexOf로 숫자를 카운트,

9보타 큰 경우는 예외처리로 n/a를 리턴하도록 함

다른 사람의 풀이

똑같음


'자료구조, 알고리즘 > Codewars 문제' 카테고리의 다른 글

What is the growth? ( 6 kyu )  (0) 2017.12.22
Dashatize it ( 6 kyu )  (0) 2017.12.20
String average ( 6 kyu )  (0) 2017.12.19
Array Helper ( 6 kyu )  (0) 2017.12.19
Simple Fun #290: Sum Of Threes ( 6 kyu )  (0) 2017.12.18
RGB To Hex Conversion ( 5 kyu )  (0) 2017.12.11

Array Helper ( 6 kyu )

문제

var numbers = [1, 2, 3, 4, 5];
numbers.square(); // must return [1, 4, 9, 16, 25]
numbers.cube(); // must return [1, 8, 27, 64, 125]
numbers.average(); // must return 3
numbers.sum(); // must return 15
numbers.even(); // must return [2, 4]
numbers.odd(); // must return [1, 3, 5]

배열의 메서드를 구현하는 문제

풀이

// TODO
Array.prototype.square = function () {
  return this.map( a => { return a*a } );
}

Array.prototype.cube = function () {
  return this.map( a => { return a*a*a } );
}

Array.prototype.sum = function () {
  return this.length === 0 ? 0 : this.reduce((a,b) => { return a+b } );
}

Array.prototype.average = function () {
  return this.length === 0 ? NaN : this.reduce((a,b) => { return a+b } )/this.length;
}

Array.prototype.even = function () {
  console.log(this)
  return this.filter( a => { return a % 2 === 0 } );
}

Array.prototype.odd = function () {
  return this.filter( a => { return a % 2 === 1 } );
}

설명이 필요없따

다른 사람의 풀이

똑같음


'자료구조, 알고리즘 > Codewars 문제' 카테고리의 다른 글

Dashatize it ( 6 kyu )  (0) 2017.12.20
String average ( 6 kyu )  (0) 2017.12.19
Array Helper ( 6 kyu )  (0) 2017.12.19
Simple Fun #290: Sum Of Threes ( 6 kyu )  (0) 2017.12.18
RGB To Hex Conversion ( 5 kyu )  (0) 2017.12.11
Checking Groups ( 6 kyu )  (0) 2017.12.11

Simple Fun #290: Sum Of Threes ( 6 kyu )

문제

Task

Given a number n, return a string representing it as a sum of distinct powers of three, or return “Impossible” if that’s not possible to achieve.

Input/Output

[input] integer n

A positive integer n.

1 ≤ n ≤ 10^16.

[output] a string

A string representing the sum of powers of three which adds up to n, or “Impossible” if there is no solution. If the solution does exist, it should be return as “3a1+3a2+ … +3^an”, where ai for 0 ≤ i ≤ n represents the corresponding exponent of the term. The terms in the string should also be sorted in descending order, meaning that higher powers should appear before the lower ones in the string (“30+31” is incorrect, whereas “31+30” is correct).

인자로 주어진 수가 3의 제곱수의 합으로 나타내질 수 있는지를 판별하는 문제

풀이

function sumOfThrees(n) {
  let str = n.toString(3), result = '';
  if ( !(str.indexOf('2') === -1) ) return 'Impossible';
  for ( let i = 0; i < str.length; i++ ) {
    if ( str[i] === '1' ) {
      result += `3^${str.length-1-i}+`
    }
  }
  return result.slice(0, result.length-1);
}

3의 제곱수임을 판별하기 위해 3진법으로 변환 후에, 2가 있으면 impossible을 리턴하고 else 경우에 각 진법의 자릿수만큼 곱한 스트링을 결과값에 더해 리턴

다른 사람의 풀이

function sumOfThrees(n) {
  var t = n.toString(3)
  return /2/.test(t) ? "Impossible"  : 
  [...t].reverse().reduce((a,v,k)=>
    (v==1) ? a.concat("3^"+k) : a, []).reverse().join('+')
}

접근은 같지만 깔끔한 풀이


'자료구조, 알고리즘 > Codewars 문제' 카테고리의 다른 글

String average ( 6 kyu )  (0) 2017.12.19
Array Helper ( 6 kyu )  (0) 2017.12.19
Simple Fun #290: Sum Of Threes ( 6 kyu )  (0) 2017.12.18
RGB To Hex Conversion ( 5 kyu )  (0) 2017.12.11
Checking Groups ( 6 kyu )  (0) 2017.12.11
Rectangle into Squares ( 6 kyu )  (0) 2017.12.11

2 x n 타일링 ( Level 5, JavaScript )

문제

1x1 정사각형 2개가 붙어 있는 타일이 있습니다. 이 타일을 이용하여 총 2xN 의 보드판을 채우려고 합니다. 타일은 가로, 세로 두 가지 방향으로 배치할 수 있습니다.

보드판의 길이 N이 주어질 때, 2xN을 타일로 채울 수 있는 경우의 수를 반환하는 tiling 함수를 완성하세요.

단, 리턴하는 숫자가 매우 커질 수도 있으므로 숫자가 5자리를 넘어간다면 맨 끝자리 5자리만 리턴하세요.예를 들어 N = 2일 경우 가로로 배치하는 경우와 세로로 배치하는 경우가 있을 수 있으므로 2를 반환해 주면 됩니다. 하지만 만약 답이 123456789라면 56789만 반환해주면 됩니다. 리턴하는 숫자의 앞자리가 0일 경우 0을 제외한 숫자를 리턴하세요. 리턴타입은 정수형이어야 합니다.

풀이

function tiling(n) {
    let arr = [1, 2];
  for ( let i = 2; i < n; i++ ) {
      arr[i] = arr[i-1] + arr[i-2];
    if ( arr[i].toString().length > 5 ) {
        arr[i] = Number(arr[i].toString().slice(-5));
    }
  }
  return Number(arr[n-1].toString().slice(-5));
}

피보나치 수열로 이해하면 되는데 이때 5자리 이상의 숫자들을 slice(-5)로 잘라주면서 배열에 넣어야 n이 커졌을 때도 연산이 가능하다

다른 사람의 풀이

똑같음

slice(-5) 대신 %10000 을 써놓은 분도 있었음


최고의 집합 ( Level 4, JavaScript )

문제

자연수 N개로 이루어진 집합 중에, 각 원소의 합이 S가 되는 수의 집합은 여러 가지가 존재합니다. 최고의 집합은, 위의 조건을 만족하는 집합 중 각 원소의 곱이 최대가 되는 집합을 의미합니다. 집합 원소의 개수 n과 원소들의 합 s가 주어지면, 최고의 집합을 찾아 원소를 오름차순으로 반환해주는 bestSet 함수를 만들어 보세요. 만약 조건을 만족하는 집합이 없을 때는 배열 맨 앞에 –1을 담아 반환하면 됩니다. 예를 들어 n=3, s=13이면 [4,4,5]가 반환됩니다.
(자바는 집합이 없는 경우 크기가 1인 배열에 -1을 담아 반환해주세요.)

풀이

function bestSet(n, s) {
  if ( n > s ) return [-1];
    const ave = parseInt(s/n);
  let result = new Array(n).fill(ave);
  for ( let i = 0; i < s-n*ave; i++ ) {
      result[result.length-1-i] += 1
  }
  return result
}

if문으로 예외처리를 해준 뒤

s를 n으로 나눈 몫을 n개 원소에 채워 넣은 뒤에, 남은 수를 차례대로 1씩 더해 리턴

다른 사람의 풀이

똑같음


숫자의 표현 ( Level 4, JavaScript )

문제

수학을 공부하던 민지는 재미있는 사실을 발견하였습니다. 그 사실은 바로 연속된 자연수의 합으로 어떤 숫자를 표현하는 방법이 여러 가지라는 것입니다. 예를 들어, 15를 표현하는 방법은
(1+2+3+4+5)
(4+5+6)
(7+8)
(15)
로 총 4가지가 존재합니다. 숫자를 입력받아 연속된 수로 표현하는 방법을 반환하는 expressions 함수를 만들어 민지를 도와주세요. 예를 들어 15가 입력된다면 4를 반환해 주면 됩니다.

풀이

function expressions(num) {
  let result = 0, sum = 0, j;
    for ( let i = 1; i <= num; i++ ) {
    sum = 0, j = i;
      while ( sum <= num ) {
      sum += j;
      if ( sum === num ) result++;
      j++
    }
  }
  return result;
}

이중포문으로 sum과 num이 같을 때 결과값에 1씩 더해서 결과값을 리턴

다른 사람의 풀이

function expressions(num) {
    var answer = 0;

  for(var i=1; i<=num; i++) {
    if (num%i == 0 && i%2 == 1)
      answer++
  }
    return answer;
}

신박하네 어떻게 접근한건지..

머리가 안돌아가니까 나중에 조금더 고민해봐야겠다.


야근 지수 ( Level 3, JavaScript )

문제

야근 지수
회사원인 수민이는 많은 일이 쌓여 있습니다. 수민이는 야근을 최소화하기 위해 남은 일의 작업량을 숫자로 메기고, 일에 대한 야근 지수를 줄이기로 결정했습니다. 야근 지수는 남은 일의 작업량을 제곱하여 더한 값을 의미합니다. 수민이는 1시간 동안 남은 일 중 하나를 골라 작업량 1만큼 처리할 수 있습니다. 수민이의 퇴근까지 남은 N 시간과 각 일에 대한 작업량이 있을 때, noOvertime 함수를 제작하여 수민이의 야근 지수를 최소화 한 결과를 출력해 주세요. 예를 들어, N=4 일 때, 남은 일의 작업량이 [4, 3, 3] 이라면 야근 지수를 최소화하기 위해 일을 한 결과는 [2, 2, 2]가 되고 야근 지수는 22 + 22 + 22 = 12가 되어 12를 반환해 줍니다.

풀이

function noOvertime(no, works) {
    while ( no > 0 ) {
      works = works.sort((a,b) => { return b-a });
    works[0] -= 1;
    no--;
  }
  return works.map( a => { return a*a }).reduce((a,b) => { return a+b });
}

오랜만에 다시 본 못풀었던 문젠데 다시 풀긴 풀었는데, 마땅히 좋은 풀이가 떠오르지는 않는다.

계속해서 sort를 반복하기 때문에 썩 좋은 코드는 아닌듯하다.

다른 사람의 풀이

적을만한 더 좋은 풀이가 안보인다


+ Recent posts