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
'🧬알고리즘 > Programmers' 카테고리의 다른 글
[JavaScript] 특정한 문자를 대문자로 바꾸기 (0) | 2024.06.12 |
---|---|
[JavaScript] 1로 만들기 (0) | 2024.06.12 |
[JavaScript] 수열과 구간 쿼리 1 (1) | 2024.06.11 |
[JavaScript] 왼쪽 오른쪽 (1) | 2024.06.11 |
[JavaScript] 순서 바꾸기 (0) | 2024.06.11 |
댓글