프로그래머스 조건에 맞게 수열 변환하기 2 Lv.0

KUKJIN LEE's profile picture

KUKJIN LEE3주 전 작성

function solution(arr) {
    let answer = 0;
    
    while(true) {
        const nextArr = arr.map((value) => {
            if(value >= 50 && value % 2 === 0) {
                return value / 2;
            } else if (value < 50 && value % 2 === 1) {
                return value * 2 + 1;
            } else {
                return value;
            }
        });
        
        let check = true;
        for(let i = 0; i < arr.length; i++) {
            if(arr[i] !== nextArr[i]) {
                check = false;
                break;
            }
        }
        
        if(check) {
            return answer;
        } else {
            arr = nextArr;
            answer++;
        }
    }
    return answer;
}

우선 `map` 함수에 대한 간단한 설명을 드리겠습니다.

`map` 함수는 JavaScript 배열 메서드 중 하나로, 기존 배열을 변경하지 않고 새로운 배열을 만들어 낼 수 있습니다.

예를 들어 `arr.map((value) => value * 2)` 코드를 돌리면, arr 안의 원소에 대해 곱하기 2 한 값을 차례대로 모은 새 배열이 생성됩니다.

 

따라서 `map` 구문을 자유롭게 다룰 수 있어야 풀 수 있는 문제입니다.

조건을 찾기 위해 값을 담아 줄 nextArr을 만들었고, value를 인자로 받아 문제 요구사항에 맞춰 값을 변화시켰습니다.

  • 값이 50 이상인 짝수일 경우, `value / 2`를 새 배열 요소로 반환
  • 값이 50 미만인 홀수일 경우, `value * 2 + 1`을 새 배열 요소로 반환
  • 그 외 경우 기존 값을 유지합니다.

규칙을 적용한 결과물이 더 이상 변화되지 않는 시점에서 답을 찾을 수 있습니다.

 

전체 동작 흐름 정리

  1. while(true) 구문 안에서 매 반복마다 arr를 기반으로 nextArr를 생성합니다.
  2. nextArr가 이전 arr와 완전히 같다면(check === true), 변화가 없으므로 여기서 멈추고 answer(지금까지 몇 번 변화했는지 세어둔 횟수)를 반환합니다.
  3. 만약 이전 배열과 달라졌다면(check === false), 더 변할 여지가 있으므로 arr = nextArr로 업데이트해주고, answer를 1 증가시킵니다. 그리고 다시 같은 작업을 반복합니다.
  4. 이렇게 계속 반복하다가, 더 이상 배열이 변화되지 않는 시점return answer;를 해주어 함수가 종료됩니다.

New Tech Posts