[Level1] 5. 21 ~ 25




하루 세문제씩 꾸준히 풀기! 였으나 문제가 너무 쉬워서 5개를 풀어보겠다😂


21. 예산

프로그래머스

function solution(d, budget) {
  d.sort((x, y) => x - y);
  let sum = 0;
  let cnt = 0;
  for (let i = 0; i < d.length; i++) {
    if (sum + d[i] <= budget) {
      sum += d[i];
      cnt++;
    } else {
      break;
    }
  }
  return cnt;
}


너무 간단한 문제였어서, 리뷰할게 딱히 없다!
d 배열은 내림차순으로 정렬해야한다는게 포인트인것 같다!

다른 사람 풀이


function solution(d, budget) {
    d.sort((a, b) => a - b);

    while (d.reduce((a, b) => (a + b), 0) > budget) d.pop();

    return d.length;
}

누적합이 필요하니 reduce를 써야한다는 것은 생각했었는데 중간에 조건이 붙으면 그만둬야하니 이용하지 않았는데, 위의 코드도 가능하다.
하지만 반복할 때마다 reduce 를 호출해서 pop까지 해서 효율성은 내 코드보다 많이 떨어진다.



22. 음양 더하기

programmers

function solution(absolutes, signs) {
  let answer = 0;
  for (let i = 0; i < absolutes.length; i++) {
    answer = signs[i] ? answer + absolutes[i] : answer - absolutes[i];
  }
  return answer;
}


이제 1단계 문제는…확실히 금방한다! 신난다!!
간단해서 리뷰할게 없으니 pass

best 풀이

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


정말 베스트풀이에는 빠질 수 없는 reduce 같다.
효율은 똑같을 거 같은데 reduce를 쓰는게 더 바람직한 걸까?
누적합을 더할 변수(like sum)을 별도로 만들지 않아도 된다는 장점이 있긴 한데 이건 메모리에 크게 부담을 주지 않으니 고민이다!



23. 수박수박수박수박수박수?

programmers

function solution(n) {
  let answer = "";
  let arr = ["수", "박"];
  for (let i = 0; i < n; i++) {
    answer += i % 2 ? arr[1] : arr[0];
  }
  return answer;
}


best 풀이

function waterMelon(n){
  var result = "수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박"
  return result.substring(0,n);
}


ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ이건 절대 좋은 코드는 아니지만 best다.
사람들이 다 빵터진듯…ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
약간 별찍기 전문가는 for를 안찍고 printf(“***“)을 하듯…ㅋㅋㅋ



24. x만큼 간격이 있는 n개의 숫자

programmers

function solution(x, n) {
  var answer = [];
  let temp = 0;
  for (let i = 0; i < n; i++) {
    temp += x;
    answer[i] = temp;
  }
  return answer;
}

best 풀이

function solution(x, n) {
    return Array(n).fill(x).map((v, i) => (i + 1) * v)
}

우와 코드 깔끔하고 이런 방법도 있구나를 깨닫는다.
사람들 정말 믓찌다.


25. 행렬의 덧셈🤔

programmers

function solution(arr1, arr2) {
  let answer = [];
  for (let i = 0; i < arr1.length; i++) {
    let empty = [];
    for (let j = 0; j < arr1[i].length; j++) {
      empty.push(arr1[i][j] + arr2[i][j]);
    }
    answer.push(empty);
  }
  return answer;
}

사실 이중 for문까진 했는데 그걸 어떻게 연결해야할지 몰라서 다른사람의 풀이를 보고 이해한 뒤 다시 풀었다.
안쪽에서 배열을 쌓고 그걸 한번씩 push 해주면 된다는 것을 깨달았다.
역시 자만 금지!

best 풀이

return arr1.map((a, i) => arr2[i].map((b, j) => b + arr1[i][j]));

코드가 짧긴 한데 직관적으로 보이지가 않아서 어렵다ㅠㅠ