본문 바로가기
기초다지기/JS 코딩테스트

javascript 조건에 맞게 수열 변환

by 김빵그 2023. 8. 22.

문제

정수배열 각 원소에 대해 50보다 크고, 같은 짝수라면 2로 나누고 50보다 작은 홀수라면 2를 곱하고 다시 1을 더한다. 이러한 작업을 x번 반복 전의 arr(x)값과 arr(x+1) 이 같을때 최소 x 값을 구해라

내해답

for (let i = 0; i < arr.length; i++) { 
        if (arr[i] >= 50 && arr[i] % 2 === 0) { 
            array.push(arr[i] / 2);
        } else if(arr[i] < 50 && arr[i] % 2 !== 0){
            array.push(arr[i] * 2 + 1); 
        }else {
            array.push(arr[i])
        }
    }
  • 여기까진 호기롭게 for문으로 풀었는데 이 작업을 x번 반복, arr(x)와 arr(x+1)이 같을 때 x를 구하는 방법을 모르겠다!
  • 구글링의 힘을 빌린 답..
function solution(arr) {
    const operate = value => (value >= 50 && value % 2 === 0) ?
                            value / 2 :
                            (value < 50 && value % 2 !== 0) ?
                            value * 2 + 1 :
                            value;

    let x = 0;

    while (arr.some((value, index) => value !== operate(arr[index]))) {
        arr = arr.map(operate);
        x++;
    }

    return x;
}
  • operate : 주어진 조건에 따라 값을 계산하고 반환 
  • x : 위의 조건 연산을 몇 번 반복했는지  
  • while : 배열이 조건에 맞을때까지 반복
  • value가 60이라면 operate(60)은 30이 된다 30  !==60 이 되어 true 
  • arr.some : 배열 내 조건에 맞지 않는 값이 있는지 확인
  • arr.map : 배열 arr의 각 원소를 operate 함수에 적용하여 새로운 배열을 생성하는 역할

다른 답

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

    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;
}
  • arr.every : 배열내의 모든 원소가 주어진 조건을 만족하는지 확인
function solution(arr) {
  const isConvertable = (v) => (50 <= v && v % 2 === 0) || (v < 50 && v % 2 === 1);
  const convert = (arr) => arr.map((v) => (v % 2 ? v * 2 + 1 : v / 2)).filter(isConvertable);

  let answer = 0;
  let current = arr.filter(isConvertable);
  while (0 < current.length) {
    current = convert(current);
    answer += 1;
  }
  return answer;
}
  • inConvertable : 주어진 값 v에 대한 변환 가능여부 확인하는 함수
  • convert : 각 원소에 변환을 적용하고 변환 가능한 값들로 필터링하여 새로운 배열을 생성
function solution(arr) {
    let prev = [...arr]
    let flag = 0
    let ans = 0
    while (true){
        flag = 0
        for (let i=0; i<arr.length; i++){
            if (arr[i] < 50 && arr[i] % 2) arr[i] = arr[i] * 2 + 1
            else if (arr[i] >= 50 && arr[i] % 2 === 0) arr[i] = arr[i] / 2
            else flag++
        }
        if (flag === arr.length) break
        prev = [...arr]
        ans++
    }
    return ans

}
function solution(arr) {
    let answer = 0;

    while (!arr.every(value => {
        if (value < 50 && value % 2) return (value = value * 2 + 1), true;
        else if (value >= 50 && value % 2 === 0) return (value /= 2), true;
        else return false;
    })) {
        answer++;
    }

    return answer;
}

 


어렵다.... 어려워