Simple reversed parenthesis ( 6 kyu )

문제

Given a string, return the minimal number of parenthesis reversals needed to make balanced parenthesis.

For example:

solve(")(") = 2 Because we need to reverse ")" to "(" and "(" to ")". These are 2 reversals.
solve("(((())") = 1 We need to reverse just one "(" parenthesis to make it balanced.
solve("(((") = -1 Not possible to form balanced parenthesis. Return -1.

괄호쌍을 맞추기 위해 최소 몇개의 괄호를 뒤집어야 하는지 구하는 문제

풀이

function solve(s) {
  while ( s.includes('()') ) {
    s = s.replace(/\(\)/g, '');
  }
  if ( s.length % 2 === 1 ) return -1;
  let count = 0;
  const obj = {
      ')(': 2,
      '((': 1,
      '))': 1,
    };
  for ( let i = 0; i <= s.length-2; i += 2 ) {
    count += obj[s[i]+s[i+1]]
  }
  return count;
}

맞는 괄호쌍이 없어질 때까지 while로 지워주고,

객체를 만들어 뒤집어야하는 개수를 미리 적어 놓고 찾아서 count에 더해줌

다른 사람의 풀이

function solve(s){
  if(s.length%2) return -1;
  var t=0, d=0;
  for(let c of s) {
    if(c==='(') d++;
    else if(d) d--;
    else {t++; d++;}
  }
  return t+d/2;
}

모르겠지만 신기하게 풀었다


159

2017 회고록

2018년 1월 1일 하루가 끝나갈 때쯤 올해의 첫 글을 쓴다.

원래 회고록이라면 한 해의 마지막인 어제 썼어야 하는게 맞는데, 뭐 이런저런 이유로 미루다가 결국 해가 바뀌고 나서 글을 쓰게 되었다. 사실 쓸말이 안떠오르는데 그냥 쓰고싶으니까 아무말이나 해야겠다.

일단 회고록이니 작년에 뭐했나 쓰면

1. 멋사

혼자서 뭘 모르는지도 몰랐는데 굉장히 좋은 경험이었다. 좋은 사람들이랑 같은 관심사로 공부하고 노는게 이렇게 재밌었다니 ㅋㅋ 사실 술먹는게 재밌었던 것 같다ㅋ

2. 스타트업 인턴

이것도 운이 좋았다. 다닐땐 몰랐는데 나오고 나니 좋은 경험이었던것 같다. 물론 아쉬운점도 있었지만. 내가 아직은 한참 부족하단걸 매일매일 느꼈던 것 같다.


3. 각종 밋업

9XD 밋업에 추첨으로 당첨돼서 강남 위워크에서 신선한 충격을 받았다. 여태 살면서 가장 유니크한 사람을 봤는데, 얘기해보고 싶었지만 쫄보라 말을걸진 못했다.ㅎㅎ

뷰 밋업도 두번이나 참가했다.

첫번째엔 가서 무슨 배짱인지도 모르겠지만, 라이트닝 토크때 앞에 나가서 헛소리하면서 관종짓도 했는데 지금 생각해보면 황당하다ㅋㅋㅋㅋ

두번째는 운영진으로가서 출첵하는걸로 운영진 명단에 이름 살짝 얹었다. 원래 집(인천)에서 멀리가는걸(서울) 좋아하지 않는데 한두곳 가다보니까 가면서 힘들어도 막상 가보면 사람들이랑 어울리는게 재밌어서 자꾸 가게되는것 같다. 물론 낯을 좀 가려서 초면에 말거는건 언제나 힘든것 같다.

올해엔 조금 더 와이드하게 활동하면서 많은 사람들이랑 알아가고 싶다. 특히 내 북마크에 자리잡고있는 블로그의 주인분들과 만나서 얘기해보고싶다.


4. 부트캠프

인턴을 한 뒤로 혼자 공부하는데 질려버린 나는 취업 전 마지막 공부라 생각하고 부트캠프에 신청해 현재 열심히 다니고 있다.

일정이 너무 헬이긴한데 같이하는 사람들이 좋아서 재밌게 하고있다. 아직 2주밖에 안지났지만, 이미 체력은 바닥을 찍어 자꾸 낮에도 지쳐버린다. 민폐 안되게 열심히 따라가야겠다. 솔직히 처음 시작할 때의 열정이 지금은 많이 사그라들었는데, 같이 하시는분들 보면 왠지 더 열심히 해야할 것 같은 기분이 팍팍들어서 잘 온것 같다.

끝까지 잘 마무리해서 올해 2분기에 좋은 결과 있으면 좋겠다.


5. 코인

11월부터 코인이란걸 했는데, 크게는 못벌었지만, 안잃고 꾸준히 잘 벌고있다. 덤으로 천국과 지옥을 분단위로 왔다갔다하는 경험은 정말 짜릿하다. 인생은 역시 한방이야


6. 장비 구매

작년 1월1일에 맥북 프로를 중고로 사서 딱 1년 썼다. 배터리 사이클이 15에서 261이 됐으니 꽤 열심히 쓴 것 같다. 회사 들어가면서 해피해킹을 샀고, 부트캠프를 들어가면서 트랙패드를 샀다. 아마 다음 회사 들어갈 때는 에어팟을 사지 않을까 싶다!

주절주절 생각나는대로 썼는데, 역시 난 글을 너무 못쓴다ㅋㅋㅋ. 글 못써도 코드 잘치면 장땡이지~ 는 코드도 못치는게 함정ㅎㅎ 추진력이 엄청난 사람은 아니라 한번에 전력질주는 안돼도 꾸준히 오래 달릴순 있을 것 같다. 계속하면 글도 코딩도 늘겠지뭐~~

이제 올해의 목표를 세우면, 다이어리 1년동안 꾸준히 쓰기. 구체적인 목표는 다이어리에쓰고 나만 봐야지. 요즘 바쁘지만 하루하루 재밌게 보내서 기분이 좋다. 연말까지 텐션 안떨어지게 열심히 살아야겠다.

이제 반오십 25살인데 뭔가 이루기에 적당한 나이인것 같다. 올해도 화이팅!


'끄적끄적' 카테고리의 다른 글

2017 회고록  (5) 2018.01.01
오늘의 성과  (3) 2017.12.05
개발 입문, 과정 + 세달간의 스타트업 인턴 회고  (9) 2017.10.01
  1. 2018.01.18 22:50

    비밀댓글입니다

  2. BlogIcon 솜눈 2018.01.19 11:06 신고

    ^^
    정말 감사합니다^^ 처음으로 티스토리에 블로그 만들었네요.
    진심으로 감사하다는 말씀드리고, 앞으로 블로그 열심히 활동하도록 하겠습니다.
    번창하세요!

Array Deep Count ( 6 kyu )

문제

Array.prototype.length will give you the number of top-level elements in an array.

Your task is to create a function deepCount that returns the number of ALL elements within an array, including any within inner-level arrays.

For example:

deepCount([1, 2, 3]);
//>>>>> 3
deepCount(["x", "y", ["z"]]);
//>>>>> 4
deepCount([1, 2, [3, 4, [5]]]);
//>>>>> 7

배열에서 내부의 배열 인자개수까지 모두 세는 문제

풀이

function deepCount(a){
  let count = 0;
  const recursion = arr => {
    count += arr.length;
    for ( let i of arr ) {
      if ( Array.isArray(i) ) {
        recursion(i);
      }
    }
  }
  recursion(a);
  return count;
}

재귀를 통해 인자가 배열이면 함수를 다시 호출하는 방법

다른 사람의 풀이

function deepCount(a){
  return a.reduce((s,e)=>s+(Array.isArray(e)?deepCount(e):0),a.length);
}

위에 있는 코드를 압축해놓으면 딱 이모양인데 멋있는 코드


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

Integer depth ( 6 kyu )  (0) 2018.01.10
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

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 을 써놓은 분도 있었음


+ Recent posts