문제

 

풀이 코드

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 를 사용할수 있다.

더 공부해 봐야겠다

문제

 

풀이 코드

function solution(absolutes, signs) {
  return absolutes.reduce((prev, current, idx) => {
    return signs[idx] === true ? prev + current : prev + -current;
  }, 0);
}

 

풀이 과정

reduce 함수를 통해 간단히 구현했지만, 아무래도 가독성이 좀 떨어지는거 같았다.

더 간략하게 줄일수 있을거 같아서 다른사람의 풀이를 보고 스스로 자책했다.

 

다른사람의 풀이

function solution(absolutes, signs) {

    return absolutes.reduce((acc, val, i) => acc + (val * (signs[i] ? 1 : -1)), 0);
}

삼함 연산자에서 참 / 거짓 을 판별하기 때문에 그냥 signs[idx] 만으로도 판별이 가능한데

나는 바보처럼 === true 이거까지 붙여 코드가 더 길어졌다.

생각하고 코딩할것!

문제

 

풀이 코드

function solution(n, arr1, arr2) {
  let mapArr = arr1.map((item, index) => item | arr2[index]);
  return mapArr
    .map((item) => item.toString(2).padStart(n, '0'))
    .map((binary) =>
      binary
        .split('')
        .map((ii) => (ii === '1' ? '#' : ' '))
        .join('')
    );
}

 

풀이 과정

문제를 보자마자 비트연산을 해야하는것을 알았다.

OR 연산을 통해, 하나라도 1이라면 #으로, 둘다 0이라면 공백으로 지도를 채우면 된다.

 

그래서 우선 mapArr 라는 배열에 arr1 의 요소와 arr2 의 요소를 각각 OR 연산한 값을 저장하였고,

mapArr 에서, 해당 값들을 toString(2) 를 통해, 2진법으로 변환하고, n만큼의 자릿수를 확보하기 위하여 padStart 함수를 통해 빈 값들을 앞에서부터 0으로 채워줬다.

 

이후 각 요소를 나누어 배열로 만든다음, 해당 요소가 1이라면 # 을, 0이라면 공백을 치환한다음, join으로 하나의 문자열로 다시 만들어

해당 배열을 반환했다.

 

전부터 많이 봐왔던 유형이라 그런지 나름 쉽게 풀어냈다.

다만, 내가 봐도 가독성이 너무 떨어지는걸 느꼇고, 이에따라 다른사람의 풀이를 보게 되었다.

 

다른사람의 풀이

// 방법 1
function solution(n, arr1, arr2) {
    return arr1.map((v, i) => addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, a => +a ? '#' : ' '));
}

const addZero = (n, s) => {
    return '0'.repeat(n - s.length) + s;
}

// 방법 2
var solution=(n,a,b)=>a.map((a,i)=>(a|b[i]).toString(2).padStart(n,0).replace(/0/g,' ').replace(/1/g,'#'))

정규표현식이 확실히 깔끔하다.

이건 공부를 한번 날잡고 제대로 해봐야겠음

문제

 

풀이 코드

function solution(a, b) {
    let answer = 0;
    for (let i = 0; i < a.length; i++) {
        answer += a[i] * b[i]
    }
    return answer;
}

 

풀이 과정

간단히 for 루프로 계산하였다.

 

다른사람의 풀이

function solution(a, b) {
    return a.reduce((acc, _, i) => acc += a[i] * b[i], 0);
}

reduce 를 이용해 한줄로 깔끔하게!

+ Recent posts