231115 TIL

chillakilla·2023년 11월 16일

이어 붙인 수

Q : 정수가 담긴 리스트 num_list가 주어집니다. num_list의 홀수만 순서대로 이어 붙인 수와 짝수만 순서대로 이어 붙인 수의 합을 return하도록 solution 함수를 완성해주세요.

입출력 예

솔루션 코드

<script>
function solution(num_list) {
  let num1 = 0;
  let num2 = 0;

  for (let i = 0; i < num_list.length; i++) {
    if (num_list[i] % 2 !== 0) {
      num1 = num1 * 10 + num_list[i];
    } else {
      num2 = num2 * 10 + num_list[i];
    }
  }
  return num1 + num2;
}
</script>
  • 그냥 합이 아니라, 이어서 붙인 수를 반환하라고 한다.
  • 그렇다면 짝수와 홀수를 솎아낸 다음, 그걸 이어 붙이면 되겠지?
  • 처음엔 map 과 filter를 사용해보려고 생각은 했으나,
  • 막상 손 끝에서 그 함수 식이 잘 나오지 않아서 지우고 결국 for 문으로 해보기로 했다.
  • 먼저 짝수와 홀수의 초기값을 정해주고, for 문을 통해 입력값을 돌린 후,
  • % 나머지 연산자를 통해 0이 아니냐(홀수), 0 이냐(짝수)를 판단, 각각 변수에 담아준다.
  • 그때, * 10을 통해서 자연스레 숫자로 변환시켜준다.
  • 그리고나서 최종적으로 num1 + num2를 반환시킨다.


다른 사람의 풀이

  1. 내가 사용해보고 싶었던 map 함수를 이용한 풀이
<script>
function solution(num_list) {
    const odd = [...(num_list+"")].map(x => Number(x)%2 === 1 ? x : "").join("")
    const even = [...(num_list+"")].map(x => Number(x)%2 === 0 ? x : "").join("")
    return Number(odd)+Number(even);
}

</script>

스프레드 오퍼레이터와 삼항 연산자까지 들어갔다.

  1. parseInt 와 reduce를 사용한 풀이
<script>
function solution(num_list) {
  const concat = (a, b) => parseInt(`${a}${b}`, 10);
  const [odd, even] = num_list.reduce(
    ([odd, even], num) => (num % 2 ? [concat(odd, num), even] : [odd, concat(even, num)]),
    [0, 0],
  );
  return odd + even;
}

</script>
  1. 나와 흡사하지만 다른 방식의 풀이
<script>
function solution(num_list) {
    let numA="",numB="";
    for(let i = 0 ; i < num_list.length ; i++){
        if(num_list[i]%2===0)
            numA+= num_list[i];
        else
            numB+= num_list[i];

    }
    return +numA + +numB;
}
</script>

이번 문제는 굉장히 다양한 풀이가 있었다.

다른 문제를 풀면서 배운 것도 있었지만, 막상 내가 적용하지 못한 것에 대해 아쉬운 점이 존재했다.
하지만 이렇게 또 꾸역꾸역 기억하고 체득시키는 것도 나쁘지는 않다고 판단된다.

profile
꾸준하려 하는 쉽덕놈

0개의 댓글