CodingTest

Day17: 배열 만들기 2, 원소들의 곱과 합, 수열과 구간 쿼리3, 수열과 구간 쿼리2, 5명씩, 문자열 잘라서 정렬하기

curious week 2025. 9. 10. 10:35

배열 만들기 2

정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.

function solution(l, r) {
    let a = []

    for(let i = l; i <= r; i++) {
        let d = String(i)
        let e = [...d].every((c) => c === '0' || c === '5') 
        if(e) a.push(i) 
    }
    
    if(a.length < 1) a.push(-1)
    return a
}

다른 답:

function* gen50() {
    let i = 1;

    while(true) {
        yield Number(Number(i).toString(2)) * 5;
        i++;
    }
}
function solution(l, r) {
    const n = gen50();
    let a = 0;
    const arr = [];

    while(a < l) { a = n.next().value; }
    while(a <= r) { arr.push(a); a = n.next().value; }

    return arr.length ? arr : [-1];
}

toString(2)로 이진수로 바꿔서 계산

function solution(l, r) {
    const result = Array.from({length:r-l+1}, (_,i)=>i+l).filter(n=>!/[^05]/.test(n));
    return result.length ? result : [-1];
}

정규식 활용


원소들의 곱과 합

정수가 담긴 리스트 num_list가 주어질 때, 모든 원소들의 곱이 모든 원소들의 합의 제곱보다 작으면 1을 크면 0을 return하도록 solution 함수를 완성해주세요.

function solution(num_list) {
    let a = 1
    let b = 0
    num_list.forEach(v => a *= v)
    num_list.forEach(v => b += v)
    return a < b ** 2 ? 1 : 0
}

다른 답:

function solution(num_list) {
    return 
    	Math.pow(num_list.reduce((a,b) => a+b), 2) 
        > num_list.reduce((a,b) => a*b) 
    	? 1 : 0;
}

수열과 구간 쿼리3

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.
각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

function solution(arr, queries) {
    let a = 0
    let b = 0
    for(let i = 0; i < queries.length; i++) {
        a = queries[i][0]
        b = queries[i][1]
        temp = [...arr]
        for(let j = 0; j < arr.length; j++) {
            if(j === a) arr[j] = temp[b]
            if(j === b) arr[j] = temp[a]
        }
    }
    return arr
}

다른 답:

function solution(arr, queries) {
    queries.forEach( ([a,b]) => {
        [arr[a],arr[b]] = [arr[b],arr[a]];
    })
    return arr;
}

구조 분해 후 할당

function solution(arr, queries) {
    return queries.reduce((bucket, [a, b]) => {
        const temp = bucket[a]
        bucket[a] = bucket[b]
        bucket[b] = temp
        return bucket
    }, [...arr])
}

reduce로 같은 방식

function solution(arr, q) {
    var answer = [];

    q.map((a)=>{
        let z = arr[a[0]]
        let b = arr[a[1]]
        arr[a[0]] = b
        arr[a[1]] = z
    })

    return arr;
}

map 사용


수열과 구간 쿼리2

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

function solution(arr, queries) {
    let a = []
    let b
    queries.forEach(([s, e, k], idx) => {
        b = []
        arr.forEach((v, i) => {
            if(i >= s && i <= e && k < v) {
                b.push(v)
            }
        })
        b.length > 0 ? a[idx] = b.sort((a, b) => a - b).at(0) : a[idx] = -1
        
    })
    return a
}

다른 답:

function solution(arr, queries) {
    return queries.map(([s, e, k]) => 
    	arr.slice(s, e + 1)
        	.filter((n) => n > k)
        	.sort((a, b) => a - b)[0] || -1);
}

정렬 후 가장 작은 값

function solution(arr, queries) {
    return queries.map(([s, e, k]) => {
        const result = arr.slice(s, e + 1).filter(num => num > k);
        return result.length > 0 ? Math.min(...result) : -1;
    });
}

최소값 쓰기

function solution(arr, queries) {
    return queries.map(([s, e, k]) => {
        let result = -1
        for (let i = s; i <= e; i += 1) {
            const v = arr[i]
            if (v <= k) continue
            result = result === -1 ? v : Math.min(result, v)
        }
        return result
    })
}

5명씩

최대 5명씩 탑승가능한 놀이기구를 타기 위해 줄을 서있는 사람들의 이름이 담긴 문자열 리스트 names가 주어질 때, 앞에서 부터 5명씩 묶은 그룹의 가장 앞에 서있는 사람들의 이름을 담은 리스트를 return하도록 solution 함수를 완성해주세요. 마지막 그룹이 5명이 되지 않더라도 가장 앞에 있는 사람의 이름을 포함합니다.

function solution(names) {
    return names.filter((_, i) => i % 5 === 0)
}

다른 답:

function solution(names) {
    var answer = [];
    for(let i = 0; i < names.length; i += 5){
        answer.push(names[i])
    }
    return answer;
}

index를 건너뛰는 방법


문자열 잘라서 정렬하기

문자열 myString이 주어집니다. "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return 하는 solution 함수를 완성해 주세요.
단, 빈 문자열은 반환할 배열에 넣지 않습니다.

function solution(myString) {
    return myString.split('x').sort().filter(v => v.length)
}

다른 답:

const solution = s => s.match(/[^x]+/g).sort()
function solution(myString) {
    return myString.split("x").filter(Boolean).sort();
}