프로그래머스 조건에 맞게 수열 변환하기 2 Lv.0
KUKJIN LEE • 3일 전 작성
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`을 새 배열 요소로 반환
- 그 외 경우 기존 값을 유지합니다.
규칙을 적용한 결과물이 더 이상 변화되지 않는 시점에서 답을 찾을 수 있습니다.
전체 동작 흐름 정리
while(true)
구문 안에서 매 반복마다arr
를 기반으로nextArr
를 생성합니다.nextArr
가 이전arr
와 완전히 같다면(check === true
), 변화가 없으므로 여기서 멈추고answer
(지금까지 몇 번 변화했는지 세어둔 횟수)를 반환합니다.- 만약 이전 배열과 달라졌다면(
check === false
), 더 변할 여지가 있으므로arr = nextArr
로 업데이트해주고,answer
를 1 증가시킵니다. 그리고 다시 같은 작업을 반복합니다. - 이렇게 계속 반복하다가, 더 이상 배열이 변화되지 않는 시점에
return answer;
를 해주어 함수가 종료됩니다.