문제
정수배열 각 원소에 대해 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;
}
어렵다.... 어려워
'기초다지기 > JS 코딩테스트' 카테고리의 다른 글
javascript 영문으로 표기된 숫자 문자열을 숫자의 수로 변경하기 (0) | 2023.08.26 |
---|---|
[javascript] for..of / for문 / indexOf를사용한 알파벳 등장 횟수 계산 (0) | 2023.08.25 |
javascript 배열내 길이가 같은 문자열이 가장 많은 갯수 (0) | 2023.08.20 |
[Lv0] js 정수 배열에서 숫자 n이 총 몇 개 들어있는지 (0) | 2023.08.18 |
[Lv0] js 배열내 2의 영역 (0) | 2023.08.17 |