[PS] Programmers/코딩 기초 트레이닝/ Day15/조건에 맞게 수열 변환하기 2

2023. 5. 25. 13:50✨ PS(ProblemSolving)

문제

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

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

문제 해결 전략

조건3을 만족 할 때까지 조건 1,2를 반복하는 while 루프를 만들어줌
루프가 돌 때마다 count를 추가하여 조건3을 만족하는 순간 count를 반환함.

답안

답안1

function solution(arr) {
    var count = 0;

    while (true) {
        var nextArr = arr.map(function(num) {
            if (num >= 50 && num % 2 === 0) {
                return num / 2;
            } else if (num < 50 && num % 2 === 1) {
                return num * 2 + 1;
            } else {
                return num;
            }
        });

        count++;

        if (nextArr.every(function(num, index) { return num === arr[index]; })) {
            break;
        }

        arr = nextArr;
    }

    return count - 1;
}

답안2: 좀 더 간결함

function solution(arr, n = 0) {
    while(!arr.every(x => (x >= 50 && x % 2 === 1) || (x < 50 && x % 2 === 0))) {
        arr = arr.map(x => {
            if (x >= 50 && x % 2 === 0) return x / 2
            if (x < 50 && x % 2 === 1) return x * 2 + 1
            retrun x
        })
        n++
    }
    return n
}

매서드 정리: .every()

arr.every(callbackFunction)
배열 안에 있는 모든 요소에 대해 callback함수 조건을 검사함. callback함수는 boolean 값을 반환해야함.
[https://terryehlee.tistory.com/60]