[Lv.0] 조건에 맞게 수열 변환하기 2

woodstock·2024년 2월 25일
0

코딩테스트

목록 보기
49/56
post-thumbnail

조건에 맞게 수열 변환하기 2

문제설명

정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.

이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.

단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.

풀이

function solution(arr) {
  let current = arr.slice();
  let count = 0;

  while (true) {
    let next = current.map(e => {
      if (e >= 50 && e % 2 === 0) {
        return e / 2;
      } else if (e < 50 && e % 2 === 1) {
        return e * 2 + 1;
      }
      return e;
    });

    if (arraysEqual(current, next)) {
      return count;
    }

    current = next;
    count++;
  }
}

function arraysEqual(a, b) {
  return a.length === b.length && a.every((val, index) => val === b[index]);
}

풀이해설

function arraysEqual(a, b) {
  return a.length === b.length && a.every((val, index) => val === b[index]);
}
  • 이 함수는 두 배열 ab가 길이가 같고, 동일한 위치에 동일한 값을 가지고 있는지 확인한다.
  • every()메서드는 배열의 모든 요소가 주어진 함수를 만족할 때 true를 반환한다.

function solution(arr) {
  // 입력배열 `arr`의 복사본을 `current`에 저장
  let current = arr.slice();
  let count = 0;

  while (true) {
    // `current`배열의 각 요소에 대한 조건부 변환을 수행
    let next = current.map(e => {
      if (e >= 50 && e % 2 === 0) {
        return e / 2;
      } else if (e < 50 && e % 2 === 1) {
        return e * 2 + 1;
      }
      return e;
    });

    // `next`와 `current`가 동일하다면
    if (arraysEqual(current, next)) {
      // 현재의 반복 횟수인 `count`를 반환
      return count;
    }

    // 동일하지 않다면 `current`를 `next`로 업데이트 하고,
    current = next;
    // `count`를 증가시킨 후, 다음 반복으로 진행
    count++;
  }
}

function arraysEqual(a, b) {
  return a.length === b.length && a.every((val, index) => val === b[index]);
}
profile
해내는 사람

0개의 댓글