문제

 

풀이 코드

const calcuGCD = (n, m) => {
  return n % m == 0 ? m : calcuGCD(m, n % m);
};

function solution(arr) {
  let gcd = calcuGCD(arr[0], arr[1]);
  let lcm = (arr[0] * arr[1]) / gcd;

  for (let i = 2; i < arr.length; i++) {
    gcd = calcuGCD(lcm, arr[i]);
    lcm = (lcm * arr[i]) / gcd;
  }
  return lcm;
}

 

풀이 과정

여러 수의 최소공배수를 구하는 방법은 다음과 같다.

 

1. A 와 B 의 최소공배수를 구한다.

2. 1의 최소공배수와 C의 최소공배수를 구한다.

3. 2의 최소공배수와 D의 최소공배수를 구한다.

4 ... 반복한다

 

이렇게 하면 N개 수의 최소공배수를 구할수 있다.

 

최소 공배수를 구하기 위하여 

유클리드 호제법을 이용한 최대 공약수 계산 함수를 생성하고,

 

인덱스 0 과 1 의 최소공배수를 우선 구한후,

다음 인덱스의 수들과 의 최소공배수를 구하도록 하였다.

 

다른사람의 풀이

function nlcm(num) {
 return num.reduce((a,b) => a*b / gcd(a,b))  
}

function gcd(a, b) {
  return a % b ? gcd(b, a%b) : b
}

할말을 잃었다.

풀이가 너무 간단하게 나왔다

문제

 

풀이 코드

function solution(A,B){
    let a = A.sort((a,b) => a - b);
    let b = B.sort((a,b) => a - b).reverse();
    let sum = 0;
    
    for (let i = 0; i < a.length; i++) {
        sum = sum + (a[i] * b[i]);
    }
    return sum;
}

 

풀이 과정

우선, A 배열과 B 배열을 모두 정렬하되, 

A배열은 오름차순, B 배열은 내림차순으로 정렬 하였다,

 

이렇게 한 이유는 문제에서 각 요소의 곱을 모두 더하여 최솟값을 만드는 문제였다,

따라서 하나의 배열내의 최대값과,  또 다른 배열내의 최소값을 곱해 모두 더하면 그게 최소값이 될것이다.

 

이렇게 정렬한 후, for 루프를 통해 각 요소의 곱을 sum 변수에 누적 합산 하였다.

 

다른사람의 풀이

function solution(A,B){
    A.sort((a, b) => a - b)
    B.sort((a, b) => b - a)
    return A.reduce((total, val, idx) => total + val * B[idx], 0)
}

풀이 방법이 비슷하지만 reduce 라는 내장함수를 사용하셨다

문제

 

풀이 코드

function solution(s) {
    return s.split(" ").map(item => {
        if(item !== '')
            return item[0].toUpperCase() + item.substr(1).toLowerCase()
    }).join(" ")
}

 

풀이 과정

문자열을 공백 기준으로 우선 나누고, map 메서드를 통해 해당 인덱스가 공백이 아닌경우 ( ' ' 으로만 나누어진 경우가 이에 해당 )

해당 인덱스의 요소의 첫 문자만 대문자로 치환하고, 이후의 문자들을 붙여 반환하였다, 마지막으로 join 을 통해 나누어진 배열을 다시 하나의 문자열로 구성하였다.

 

처음 문제를 풀때 오류가 발생했는데 원인이 바로 공백으로만 나누어진 경우였다.

따라서 if 구절을 통해 공백이 아닌 경우에만 계산하도록 작성하였다

 

다른사람의 풀이

function solution(s) {
    return s.split(" ").map(v => v.charAt(0).toUpperCase() + v.substring(1).toLowerCase()).join(" ");
}

if 구문없이 charAt 을 이용하여 접근하셨다.

문제

 

풀이 코드

function solution(participant, completion) {
  let i;

  completion.sort();
  participant.sort();
  for (i = 0; i < completion.length; i++)
    if (participant[i] != completion[i]) break;
  return participant[i];
}

 

풀이 과정

처음에 indexOf 를 통해 풀이하였으나, 효율성 테스트를 통과하지 못하였다,

따라서 두 배열을 우선 모두 정렬한후,

일치하지 않다면 해당 선수가 완주하지 못한것이라고 판단하였다.

 

효율성 측면에서 더욱 효율적으로 코드를 작성하는 습관을 들여야겠다.

 

다른사람의 코드

var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))

이분은 한줄로 깔끔하게 작성하였다.

코드를 이해해 보도록 해야겠다.

 

가독성이 떨어지는거 같기도 하고.

문제

 

 

풀이 코드

function solution(lottos, win_nums) {
  let count = 0;
  let point = [];

  for (let i = 0; i < win_nums.length; i++) {
    if (lottos.indexOf(win_nums[i]) != -1) count++;
  }
  point.push(count < 2 ? 6 : 7 - count);

  for (let i = 0; i < lottos.length; i++) {
    if (lottos[i] === 0) {
      count++;
    }
  }
  point.push(count < 2 ? 6 : 7 - count);
  return point.sort((a, b) => a - b);
}

 

풀이 과정

for 루프를 각각 두번 돌려 배열에 순위를 할당해 주었다.

비교적 간단한 문제였다 이 문제를 풀며 배운것은 indexOf 로 배열 내의 특정 값을 찾을수 있다는것이다!

값을 찾지 못하면 -1을 반환하고, 찾았다면 해당 인덱스를 반환해준다

 

그렇게 해서 최초로 일치하는수 를  7에서 빼주면 최저 순위가 되고,

 

0인 부분이 모두 일치했을때도 count를 올려주고 최고 순위를 계산해 주었다.

 

다른사람의 코드

function solution(lottos, win_nums) {
    const rank = [6, 6, 5, 4, 3, 2, 1];

    let minCount = lottos.filter(v => win_nums.includes(v)).length;
    let zeroCount = lottos.filter(v => !v).length;

    const maxCount = minCount + zeroCount;

    return [rank[maxCount], rank[minCount]];
}

아 filter를 이용하여 풀수있었다.

게다가 include 를 사용할수 있다.

더 공부해 봐야겠다

+ Recent posts