Pete, the baker ( 5 kyu )

문제

Pete likes to bake some cakes. He has some recipes and ingredients. Unfortunately he is not good in maths. Can you help him to find out, how many cakes he could bake considering his recipes?

Write a function cakes(), which takes the recipe (object) and the available ingredients (also an object) and returns the maximum number of cakes Pete can bake (integer). For simplicity there are no units for the amounts (e.g. 1 lb of flour or 200 g of sugar are simply 1 or 200). Ingredients that are not present in the objects, can be considered as 0.

Examples:

// must return 2
cakes({flour: 500, sugar: 200, eggs: 1}, {flour: 1200, sugar: 1200, eggs: 5, milk: 200}); 
// must return 0
cakes({apples: 3, flour: 300, sugar: 150, milk: 100, oil: 100}, {sugar: 500, flour: 2000, milk: 2000});

만들 수 있는 완제품의 개수를 리턴하는 문제

풀이

function cakes(recipe, available) {
  let num = [];
  for ( let i in recipe ) {
    if ( available[i] === undefined ) return 0;
    num.push(parseInt(available[i]/recipe[i]))
  }
  num.sort((a,b) => { return a-b });
  return num[0];
}

이용가능한 재료에 레시피 내용이 없으면 0 리턴, 나머지는 재료마다 가능한 개수를 num에 담아 최솟값을 리턴

다른 사람의 풀이

function cakes(recipe, available) {
  return Object.keys(recipe).reduce(function(val, ingredient) {
    return Math.min(Math.floor(available[ingredient] / recipe[ingredient] || 0), val)
  }, Infinity)  
}

똑똑하게 잘푼 풀이.


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

Does my number look big in this? ( 6 kyu )  (0) 2017.12.11
Triangle type ( 6 kyu )  (0) 2017.12.09
Pete, the baker ( 5 kyu )  (0) 2017.12.09
Largest 5 digit number in a series ( 5 kyu )  (0) 2017.12.08
Sort the odd ( 6 kyu )  (0) 2017.12.06
Is a number prime? ( 6 kyu )  (0) 2017.12.06

Largest 5 digit number in a series ( 5 kyu )

문제

In the following 6 digit number:

283910

91 is the greatest sequence of 2 digits.

In the following 10 digit number:

1234567890

67890 is the greatest sequence of 5 digits.

Complete the solution so that it returns the largest five digit number found within the number given. The number will be passed in as a string of only digits. It should return a five digit integer. The number passed may be as large as 1000 digits.

주어진 숫자중 연속된 5자리로 이루어진 가장 큰 수를 찾는 문제

풀이

function solution(digits){
  let str = digits.toString();
  let max = Number(str.slice(0, 5));
  for ( let i = 0; i <= str.length-5; i++ ) {
    if ( Number(str.slice(i, i+5)) > max ) {
      max = Number(str.slice(i, i+5))
    }
  return max;
}

5개씩 잘라서 비교한 뒤에 가장 큰 값을 리턴

다른 사람의 풀이

function solution(digits){
  if (digits.length <= 5) return Number(digits);
  return Math.max(Number(digits.substr(0, 5)), solution(digits.substr(1)));
}

접근은 같지만 메소드로 조금 더 짧게 표현


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

Triangle type ( 6 kyu )  (0) 2017.12.09
Pete, the baker ( 5 kyu )  (0) 2017.12.09
Largest 5 digit number in a series ( 5 kyu )  (0) 2017.12.08
Sort the odd ( 6 kyu )  (0) 2017.12.06
Is a number prime? ( 6 kyu )  (0) 2017.12.06
Create Phone Number ( 6 kyu )  (0) 2017.12.06

Sort the odd ( 6 kyu )

문제

You have an array of numbers.
Your task is to sort ascending odd numbers but even numbers must be on their places.

Zero isn’t an odd number and you don’t need to move it. If you have an empty array, you need to return it.

Example

sortArray([5, 3, 2, 8, 1, 4]) == [1, 3, 2, 8, 5, 4]

배열에서 홀수만 순서대로 정렬하는 문제

풀이

function sortArray(array) {
  let idx = [], odd = [], j = 0;
  for ( let i = 0; i < array.length; i++ ) {
    if ( array[i] % 2 === 1 ) {
      odd.push(array[i]);
      idx.push(i);
    }
  }
  odd.sort((a,b) => { return a-b });
  idx.sort((a,b) => { return a-b });
  for ( let i of idx ) {
    array[i] = odd[j];
    j++
  }
  return array
}

너무 복잡하게 풀었다..

array를 포문으로 돌면서 홀수와 해당 인덱스를 odd, idx에 담아 오름차순으로 정렬 후에 기본 배열 array에 정렬한 값을 대입하는 방법

다른 사람의 풀이

function sortArray(array) {
  const odd = array.filter((x) => x % 2).sort((a,b) => a - b);
  return array.map((x) => x % 2 ? odd.shift() : x);
}

맵, 필터 같이쓰면 풀수있겠다 생각은 했는데 이렇게 접근하면 풀 수 있구나 싶은 코드.

shift() 사용하기.. 메모..


Is a number prime? ( 6 kyu )

문제

Is Prime

Define a function isPrime/is_prime() that takes one integer argument and returns true/True or false/False depending on if the integer is a prime.

Per Wikipedia, a prime number (or a prime) is a natural number greater than 1 that has no positive divisors other than 1 and itself.

Example

isPrime(5)
=> true

소수인지 판별하는 문제

풀었던 문제 같은건 기분탓일까

풀이

function isPrime(num) {
  if ( num <= 1 ) return false;
  for ( let i = 2; i < num; i++ ) {
    if ( num % i === 0 ) return false;
  }
   return true;
}

2부터 num-1까지 나누어지는 수가 있는지 판별

다른 사람의 풀이

소수를 그냥 배열에 쭉적어놓고 indexOf로 써놓은 풀이가 있는데 너무길어서 복사도 안되네 ㅋㅋㅋ


Create Phone Number ( 6 kyu )

문제

Write a function that accepts an array of 10 integers (between 0 and 9), that returns a string of those numbers in the form of a phone number.

Example:

createPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) // => returns "(123) 456-7890"

The returned format must be correct in order to complete this challenge.
Don’t forget the space after the closing parenthesis!

주어진 배열로 형식에 맞게 문자열로 리턴

풀이

function createPhoneNumber(numbers){
  return `(${numbers.slice(0,3).join('')}) ${numbers.slice(3,6).join('')}-${numbers.slice(6, 10).join('')}`;
}

slice, join으로해서 작성

다른 사람의 풀이

function createPhoneNumber(numbers){
  var format = "(xxx) xxx-xxxx";

  for(var i = 0; i < numbers.length; i++)
  {
    format = format.replace('x', numbers[i]);
  }

  return format;
}

replace로 할수가 있는건 신기하네


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

Sort the odd ( 6 kyu )  (0) 2017.12.06
Is a number prime? ( 6 kyu )  (0) 2017.12.06
Create Phone Number ( 6 kyu )  (0) 2017.12.06
Convert string to camel case ( 5 kyu )  (0) 2017.12.05
Human Readable Time ( 5 kyu )  (0) 2017.12.05
Simple Pig Latin ( 5 kyu )  (0) 2017.12.05

Convert string to camel case ( 5 kyu )

문제

Complete the method/function so that it converts dash/underscore delimited words into camel casing. The first word within the output should be capitalized only if the original word was capitalized.

Examples:

// returns "theStealthWarrior"
toCamelCase("the-stealth-warrior") 

// returns "TheStealthWarrior"
toCamelCase("The_Stealth_Warrior")

풀이

function toCamelCase(str){
  while ( str.indexOf('-') !== -1 ) {
    str = str.slice(0, str.indexOf('-')) + str[str.indexOf('-')+1].toUpperCase() + str.slice(str.indexOf('-')+2, str.length)
  }
  while ( str.indexOf('_') !== -1 ) {
    str = str.slice(0, str.indexOf('_')) + str[str.indexOf('_')+1].toUpperCase() + str.slice(str.indexOf('_')+2, str.length)
  }
  return str
}

while문으로 와 -가 없어질때까지 반복문을 돌면서 를 지우고 _다음 단어를 대문자로 변경해서 리턴

다른 사람의 풀이

function toCamelCase(str){
  return str.replace(/[-_](.)/g, (_, c) => c.toUpperCase());
}

정규식으로 될거같았는데 익숙하지 않아서 고민하다가 결국 못했는데, 이렇게 쓰면 되는군


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

Is a number prime? ( 6 kyu )  (0) 2017.12.06
Create Phone Number ( 6 kyu )  (0) 2017.12.06
Convert string to camel case ( 5 kyu )  (0) 2017.12.05
Human Readable Time ( 5 kyu )  (0) 2017.12.05
Simple Pig Latin ( 5 kyu )  (0) 2017.12.05
Valid Parentheses ( 5 kyu )  (0) 2017.12.05

Human Readable Time ( 5 kyu )

문제

Write a function, which takes a non-negative integer (seconds) as input and returns the time in a human-readable format (HH:MM:SS)

HH = hours, padded to 2 digits, range: 00 - 99
MM = minutes, padded to 2 digits, range: 00 - 59
SS = seconds, padded to 2 digits, range: 00 - 59
The maximum time never exceeds 359999 (99:59:59)

You can find some examples in the test fixtures.

주어진 초를 시,분,초로 출력하는 문제

풀이

function humanReadable(seconds) {
  let result = '',h = 0, m = 0 , s = 0;
  h = parseInt(seconds/3600);
  seconds = seconds - 3600*h
  m = parseInt(seconds/60);
  seconds = seconds - 60*m;
  s = seconds;
  h < 10 ? result += '0' + h + ':' : result += h + ':';
  m < 10 ? result += '0' + m + ':' : result += m + ':';
  s < 10 ? result += '0' + s : result += s;
  return result
}

3600, 60으로 나눈 몫을 h,m, 나머지를 s에 담아 리턴

처음에 어렵게 생각해서 while문 돌리고 난리쳤는데 그럴 필요가 없었음.

다른 사람의 풀이

unction humanReadable(seconds) {
  var pad = function(x) { return (x < 10) ? "0"+x : x; }
  return pad(parseInt(seconds / (60*60))) + ":" +
         pad(parseInt(seconds / 60 % 60)) + ":" +
         pad(seconds % 60)
}

내 코드는 쓰면서도 너무 중복이 많았는데 효율적으로 잘 잡은 것 같음.

clever 130개 받을만 한 코드


Simple Pig Latin ( 5 kyu )

문제

Move the first letter of each word to the end of it, then add “ay” to the end of the word. Leave punctuation marks untouched.

Examples

pigIt('Pig latin is cool'); // igPay atinlay siay oolcay
pigIt('Hello world !');     // elloHay orldWay !

각 단어의 앞을 뒤로 옮기고 ay를 붙여 리턴하는 문제

풀이

function pigIt(str){
  let result = [];
  let arr = str.split(' ');
  for ( let i = 0; i < arr.length; i++ ) {
    result.push(arr[i].slice(1, arr[i].length) + arr[i][0] + 'ay')
  }
  return result.join(' ');
}

arr에 각 단어별로 쪼개 새로운 배열을 만들고 합쳐서 리턴

다른 사람의 풀이

function pigIt(str){
  return str.split(' ').map(function(el){
    return el.slice(1) + el.slice(0,1) + 'ay';
  }).join(' ');
}

map 쓰면 되는거네


Valid Parentheses ( 5 kyu )

문제

Write a function called that takes a string of parentheses, and determines if the order of the parentheses is valid. The function should return true if the string is valid, and false if it’s invalid.

Examples

"()"              =>  true
")(()))"          =>  false
"("               =>  false
"(())((()())())"  =>  true

Constraints

0 <= input.length <= 100

You may assume that the input string will only contain opening and closing parenthesis and will not be an empty string.

주어진 문자열이 올바른 괄호쌍으로 이루어졌는지 판별하는 문제

풀이

function validParentheses(parens){
  while ( parens.indexOf('()') !== -1 ) {
    parens = parens.slice(0, parens.indexOf('()')).concat(parens.slice(parens.indexOf('()')+2, parens.length))
  }
  return (parens === '')
}

while문으로 ()를 계속해서 지워나가고 문자열이 비었다면 true 남아있다면 false 리턴

다른 사람의 풀이

function validParentheses(parens){
  var indent = 0;

  for (var i = 0 ; i < parens.length && indent >= 0; i++) {
    indent += (parens[i] == '(') ? 1 : -1;    
  }

  return (indent == 0);
}

(면 +1 )면 -1을 더해서 0이면 true를 리턴하는 방법


Replace With Alphabet Position ( 6 kyu )

문제

Welcome.

In this kata you are required to, given a string, replace every letter with its position in the alphabet.

If anything in the text isn’t a letter, ignore it and don’t return it.

a being 1, b being 2, etc.

As an example:

alphabet_position("The sunset sets at twelve o' clock.")

Should return “20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11” as a string.

알파벳을 숫자로 치환해 리턴하는 문제

풀이

function alphabetPosition(text) {
  let result = '';
  let arr = text.toLowerCase().split(' ').join('').split('');
  for ( let i = 0; i < arr.length; i++ ) {
    if ( arr[i].charCodeAt(0) >= 97 && arr[i].charCodeAt(0) <= 122 ) {
      result += arr[i].charCodeAt(0)-96 + ' '
    }
  }
  return result.substring(0, result.length-1);
}

아스키코드로 변환한 뒤에 96만큼 빼준 값을 문자열에 추가

다른 사람의 풀이

똑같음


+ Recent posts