문제

 

풀이 코드

function solution(numbers) {
  var answer = new Set();
  for (let i = 0; i < numbers.length - 1; i++) {
    for (let j = i + 1; j < numbers.length; j++) {
      answer.add(numbers[i] + numbers[j]);
    }
  }
  return [...answer].sort((a, b) => a - b);
}

 

풀이 과정

문제를 보자마자 Set 가 생각이 났다.

사실 자바스크립트에서 Set를 공부한 적은 없지만, 객체지향이라면 있을 것 같았다.

Set는 중복없는 콜렉션을 이야기 한다.

 

입력으로 들어온 배열의 모든 요소를 각각 더해주어야 하고, 

중복을 제거하고, 오름차순으로 정렬해서 반환해야 한다.

 

그래서 Set 를 생성해 주었고, Set.add 를 통해 요소를 더해준 값을 Set에 포함시켰다. 

이런 과정에서 중복된 값이 들어온다면 당연히 Set에 포함되지 않을것이다.

 

그렇게 2중 for 문으로 요소들을 구한뒤, 배열로 반환하고, 해당 배열을 오름차순으로 정렬하여 반환하였다.

문제

 

풀이 코드

function solution(a, b) {
    const monthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    const weekDay = ['FRI','SAT','SUN','MON','TUE','WED','THU'];
    let days = 0;
    for (let i = 0; i < a - 1; i++)
        days += monthDays[i];
    days += b;
    
    const checkDay = days % 7 - 1
    return weekDay[checkDay < 0 ? 6 : checkDay];
}

 

풀이 과정

우선, 각 달마다 일수를 monthDays 배열에 담아 주었다,

그리고 요일의 정보를 weekDay 배열에 담아 주었다.

 

문제가 1월 1일부터 시작이니, days 변수에

입력된 월과 일을 계산하여, 해당 일자 까지의 총 일수를 더해주었고,

 

해당 일수를 7로 나누었을때 나머지값에 해당하는 부분이 해당 요일이 되기 때문에

index 접근을 위해 - 1을 해주었다.

 

지금 이 글을 적으면서 생각한건데, 요일 정보의 배열을 THU 부터 시작하면 굳이 -1 을 하지 않아도 됐을거같다.

그러면 마지막에 인덱스 범위 넘어갔을때 처리하는 로직을 굳이 하지 않아도 됐는데,

 

문제를 풀고나서 한번더 코드를 보며 생각을 해봐야 할것 같다!

 

다른사람의 풀이

function getDayName(a,b){
  var date = new Date(2016, (a - 1), b);
    return date.toString().slice(0, 3).toUpperCase();
}

date 객체를 이용할수도 있었다

대박!

문제

 

풀이 코드

function solution(sizes) {
  const largeNum = sizes.map((item) => (item[0] < item[1] ? item[1] : item[0]));
  const smallNum = sizes.map((item) => (item[0] > item[1] ? item[1] : item[0]));

  return Math.max(...largeNum) * Math.max(...smallNum);
}

 

풀이 과정

20분 정도를 어떻게 풀어야 할지 고민을 했다.

해당 문제는 사고력 문제인거 같았고, 스스로 아무리 고민해도 해결할 수 없을것 같았다.

 

그래서 구글링을 통해 개념만 파악했다.

해당 문제의 해결 방법은 다음과 같다.

1. 각 2차원 배열 내에서, 각 요소마다 큰수와 작은수가 반드시 나뉘어 진다. ( 명함을 정사각형으로 만들지 않을 뿐더러, 정사각형 이라 하여도 크게 문제는 없다 )

2. 각 배열내에서 큰수와 작은수를 각각 나누어 각각의 배열을 생성해 할당한다.

3. 큰수만 모여있는 배열과 작은수만 모여있는 배열에서의 각각 최대값을 뽑아 두수의 곱을 반환한다

해당 문제를 푸는 과정에서 사고력을 좀 키워야 겠다는 생각이 들었다.

 

다른사람의 풀이

function solution(sizes) {
    const [hor, ver] = sizes.reduce(([h, v], [a, b]) => [Math.max(h, Math.max(a, b)), Math.max(v, Math.min(a, b))], [0, 0])
    return hor * ver;
}

reduce 를 이용해 깔끔히 풀어낸 솔루션도 있지만.

개인적으로 가독성 측면에서 내가 푼 방법이 보기 편하다는 생각을 하게 되었다.

 

다만, reduce 를 이용해 한줄로 깔끔하게 풀어내신것도 감탄이 나왔다!

문제

 

풀이 코드

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씩 증가시키며 값을 찾아 나갔다.

 

+ Recent posts