알고리즘 문제 풀이시 자주 사용되는 테크닉

문제풀다가 자꾸 검색하게 되는 내용들을 정리

더 나은 방법이 있으면 알려주시면 감사하겠습니다

문제를 풀면서 계속 업데이트 예정!

배열이나 문자열에서 유니크한 원소 뽑아내기

const arr = [1,1,4,1,1] 

arr.filter(a => { if ( arr.indexOf(a) === arr.lastIndexOf(a) ) return a }) // [4]

위와 같이 쓰면 배열에서 유니크한 값 4를 얻을 수 있다.

문자열에서도 마찬가지로 문자열을 split으로 쪼개 filter를 사용하면 같은 결과를 얻을 수 있다.

const str = '11411'
const arr = str.split('');

arr.filter(a => { if ( arr.indexOf(a) === arr.lastIndexOf(a) ) return a }) // ['4']

배열로 결과값을 리턴하기 때문에 문자열을 원하면 toString()을 뒤에 붙여주면 되고, 넘버타입을 원하면 Number()로 감싸주면 된다.

배열이나 문자열에서 i 번째 인덱스 내용을 삭제하고 싶을 때

  1. 원본을 보존하면서 잘라내는 방법
    ```
    const arr = [1, 2, 3, 4, 5];
    let result = [];

result = arr.slice(0,2).concat(arr.slice(3,arr.length)) // 2번 인덱스 삭제

console.log(result) // [1, 2 ,4, 5];
console.log(arr) // [1, 2, 3, 4, 5]


2. 원본을 훼손하며 잘라내는 방법

let arr = [1, 2, 3, 4, 5];

arr.splice(2, 1) // 2번 인덱스부터 1개를 삭제하겠다는 의미

console.log(arr); // [1, 2, 4, 5]


저작자 표시 비영리 동일 조건 변경 허락
신고

Triangle type ( 6 kyu )

문제

In this kata, you should calculate type of triangle with three given sides a, b and c (given in any order).

If all angles are less than 90°, this triangle is acute and function should return 1.

If one angle is strictly 90°, this triangle is right and function should return 2.

If one angle more than 90°, this triangle is obtuse and function should return 3.

If three sides cannot form triangle, or one angle is 180° (which turns triangle into segment) - function should return 0.

Input parameters are sides of given triangle. All input values are non-negative floating point or integer numbers (or both).

Examples:

triangleType(2, 4, 6); // return 0 (Not triangle)
triangleType(8, 5, 7); // return 1 (Acute, angles are approx. 82°, 38° and 60°)
triangleType(3, 4, 5); // return 2 (Right, angles are approx. 37°, 53° and exactly 90°)
triangleType(7, 12, 8); // return 3 (Obtuse, angles are approx. 34°, 106° and 40°)

삼각형이 되는지 여부와 된다면 어떤 삼각형인지 구하는 문제

풀이

function triangleType(a, b, c){
  let arr = [a, b, c].sort((a,b) => { return b-a });
  if ( arr[0] >= arr[1] + arr[2] ) return 0;
  if ( arr[0]*arr[0] < arr[1]*arr[1] + arr[2]*arr[2] ) {
    return 1
  } else if ( arr[0]*arr[0] === arr[1]*arr[1] + arr[2]*arr[2] ) {
    return 2 
  } else {
    return 3
  }  
}

삼각형이 되는지 가려낸 뒤에, 모양에 따라 if문으로 리턴

다른 사람의 풀이

똑같당


저작자 표시 비영리 동일 조건 변경 허락
신고

'자료구조, 알고리즘 > 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

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 문제' 카테고리의 다른 글

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

+ Recent posts