🧬알고리즘/Programmers

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

뉴발자 2024. 6. 12.
728x90

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

문제

정수 배열 arr가 매개변수로 주어진다.

 

arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고,

 

값이 50보다 작고 홀수라면 2를 곱한 후 1을 더한다.

 

이러한 작업을 x번 반복한 결과인 배열을 arr(x) 라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재한다.

 

이러한 x중 가장 작은 값을 반환하는 함수를 작성해라.

 

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

 

 

예시

반복 횟수 arr
0 [1, 2, 3, 100, 99, 98]
1 [3, 2, 7, 50, 99, 49]
2 [7, 2, 15, 25, 99, 99]
3 [15, 2, 31, 51, 99, 99]
4 [31, 2, 63, 51, 99, 99]
5 [63, 2, 63, 51, 99, 99]
6 [63, 2, 63, 51, 99, 99]

 

이후로 arr의 값은 변하지 않으며, arr(5) = arr(6)이므로 5를 반환한다.

728x90

 

 

나의 풀이

function solution(arr) {
  let i = 0;
  
  // 특정 조건까지 무한 반복
  while(true) {
    // arr의 이전 값 복사
    const copy = [...arr];
    
    // map 함수로 원소 값 변환
    arr.map((v, j) => {
      if(v >= 50 && !(v % 2)) arr[j] = v / 2;
      if(v < 50 && v % 2) arr[j] = v * 2 + 1;
    });
    
    // 만약 복사한 배열과 arr의 값이 같다면 종료
    if( JSON.stringify(copy) === JSON.stringify(arr) ) break;
    
    i++;
  }
    
  return i;
}

 

 

다른 풀이

function solution(arr) {
  var answer = 0;
  let before = [-1];

  // 복사한 배열과 arr의 각각의 원소를 비교
  while(!arr.every((e,idx) => e == before[idx])) {
    before =[...arr];

    arr = arr.map(e => {
      if(e >= 50 & e % 2 == 0)
        return e / 2;
      if(e < 50 & e % 2 != 0)
        return e * 2 + 1;
      return e;
    })
    answer++;
  }
  return answer - 1;
}

 

 

 

 

 

 

 

 

 

 

728x90

댓글