문제

 

풀이 코드

function solution(price, money, count) {
    let total = 0;
    for (let i = 1; i <= count; i++)
        total += price * i
    return total - money < 0 ? 0 : total - money
}

 

풀이 과정

간단하게 풀어냈다.

처음 가격 * 1 + 처음 가격 * 2 ... 처음 가격 * n 

 

으로 계산하면 된다고 생각하여 for 문을 돌려 구현했다.

최종적으로 구한 값 - 소지한 돈 이 음수면, 돈이 모자르지 않기 때문에 0을 반환, 그렇지 않으면 차이값을 반환했다.

 

다른사람의 풀이

function solution(price, money, count) {
    const tmp = price * count * (count + 1) / 2 - money;
    return tmp > 0 ? tmp : 0;
}

이분을 for 문을 돌리지 않았고, 가우스 공식을 이용하셨다.

가우스 공식이란

1 ~ n 까지의 합을 구할때, 

(n * (n + 1)) / 2 

를 하면 합을 알수있다는 공식이다.

 

따라서 

count * (count + 1) / 2  에다가, 처음의 가격 Price 를 곱해 

price * count * (count + 1) / 2 를 수행한다.

 

공식숙지의 중요성

문제

 

풀이 코드

function solution(n) { 
    const start = n % 2 === 0 ? 3 : 2;
    for (let i = start; i < n; i += 2) {
        if (n % i === 1)
            return i;
    }
}

 

풀이 과정

간단한 문제였다, 다만 1부터 증가시켜 찾기엔 너무 비효율 적이라고 생각했다.

왜냐하면 n이 짝수라면, 짝수로 나누었을때는 무조건 1이 나올수가 없다,

반대로 n이 홀수라면 짝수로 나누어야지만, 1이 나올것이다.

 

이에 따라 start 값을 짝수일경우 3으로, 홀수일경우 2 로 설정하여

2씩 증가시키며 값을 찾아 나갔다.

 

문제

 

풀이 코드

function solution(s) {
    let lengthCheck = s.length / 2;
    let index = Math.floor(lengthCheck);
    return lengthCheck !== index ? s[index] : s[index - 1] + s[index]  ;
}

 

풀이 과정

문자열의 길이를 2로 나누어, 가운데 인덱스를 구해 주었다.

2로 나누었을때 값이 소수로 나온다면, 해당 길이가 홀수이기 때문에 한글자만 반환하고,

정수로 나온다면 해당길이가 짝수이기 때문에 두글자를 반환하도록 했다.

 

다른사람의 풀이

function solution(s) {
    return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1);
}

substr 을 사용해 본 적이 없어서 몰랐다.

substr을 사용하여 간결하게 나타낼수 있는 문제였다

문제

풀이 코드

function solution(dartResult) {
  let scoreSplit = dartResult.match(/\d.?\D/g);
  let count = new Array(3).fill(0);

  count = scoreSplit.map((item, index) => {
    for (let i = 0; i < item.length; i++) {
      if (!isNaN(item[i])) {
        count[index] = count[index] * 10 + Number(item[i]);
      } else if (item[i] === 'S') {
        count[index] **= 1;
      } else if (item[i] === 'D') {
        count[index] **= 2;
      } else if (item[i] === 'T') {
        count[index] **= 3;
      } else if (item[i] === '*') {
        count[index] *= 2;
        count[index - 1] *= 2;
      } else if (item[i] === '#') {
        count[index] *= -1;
      }
    }
    return count;
  });
  return count[0].reduce((sum, item) => sum + item, 0);
}

 

풀이 과정

스스로 해결하지 못하여 검색을 통해 힌트를 얻었다.

정규식을 이용해 패턴을 분리하고, 패턴을 map 함수를 통해 계산을 처리하게 구현하였다.

 

다만, 수행하면서 map 에서 2차원 배열을 반환하고, 실질적으로 해당 2차원 배열은 같은 값들이 들어있는 동일한 배열 3개가 저장된 배열이다, 
이부분이 너무 비효율 적이라고 생각했지만, 도저히 방법이 생각나지 않았다. 그래서 다른 사람의 풀이를 많이 찾아 보았다.

 

* 다른 사람의 풀이를 보며 해당 솔루션에도 문제가 있는것을 발견했다.

테스트는 통과했지만 "1S1S10S#" 에 대해 -8 이 반환되어야 하지만 전혀 다른 값이 반환된다.

 

정규식을

/\d\d?.?\D/g

로 수정하면 해당 문제도 처리 가능하다.

 

정규식에 대해서도 조금더 깊이 공부 해봐야 겠다.

 

다른사람의 코드

// 방법1. 정규식 X
function solution(dartResult) {
   let calArr = [];
    let score = 0;
    
    for (let i = 0; i < dartResult.length; i++) {
        if (!isNaN(dartResult[i])) {
            score = dartResult[i-1] == '1' ? 10 : dartResult[i]
        } else if (dartResult[i] === 'S') {
            calArr.push(score**1);
        } else if (dartResult[i] === 'D') {
            calArr.push(score**2);
        } else if (dartResult[i] === 'T') {
            calArr.push(score**3);
        } else if (dartResult[i] === '*') {
            calArr[calArr.length - 1] *= 2; 
            calArr[calArr.length - 2] *= 2; 
        } else if (dartResult[i] === '#') {
            calArr[calArr.length - 1] *= -1; 
        } 
    }
    console.log(calArr)
    return calArr.reduce((sum,item) => sum + item, 0)
}

// 방법2. 정규식 사용
function solution(dartResult) {
    const bonus = { 'S': 1, 'D': 2, 'T': 3 },
          options = { '*': 2, '#': -1, undefined: 1 };

    let darts = dartResult.match(/\d.?\D/g);

    for (let i = 0; i < darts.length; i++) {
        let split = darts[i].match(/(^\d{1,})(S|D|T)(\*|#)?/),
            score = Math.pow(split[1], bonus[split[2]]) * options[split[3]];

        if (split[3] === '*' && darts[i - 1]) darts[i - 1] *= options['*'];

        darts[i] = score;
    }

    return darts.reduce((a, b) => a + b);
}

이 문제는 조금더 공부해야 할것 같다.

 

너무 어려웠다.

문제

 

풀이 코드

function solution(arr) {
  var answer = [arr[0]];

  for (let i = 1; i < arr.length; i++) {
    if (arr[i - 1] != arr[i]) answer.push(arr[i]);
  }

  return answer;
}

 

풀이 과정

배열의 첫 요소는 무조건 포함이 되기 때문에, 우선 첫 요소를 배열에 넣어주고, 

인덱스 1 부터 비교하여 

현재 인덱스 값이 바로 앞의 인덱스 값과 같지 않은 경우만, 배열에 해당 요소를 추가하였다

 

아무래도 내장 메서드에 익숙해 져서 그런지 for 문을 사용하는 순간 뭔가 더 간단하게 구현할 수 있을거 같다 다른사람의 코드를 봤다.

 

다른사람의 코드

function solution(arr)
{
    return arr.filter((val,index) => val != arr[index+1]);
}

filter 로 인덱스 요소에 직접 접근할수 있구나;;

한번 더 배워간다!

+ Recent posts