CodingTest

Day20: 문자열 묶기, 세 개의 구분자, 2의 영역, 수열과 구간 쿼리4, 배열의 길이를 2의 거듭제곱으로 만들기

curious week 2025. 9. 13. 13:22

문자열 묶기

문자열 배열 strArr이 주어집니다. strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.

function solution(strArr) {
    let arr = Array.from({length: 30}).fill(0)
    for(let i = 0; i < strArr.length; i++) {
        arr[strArr[i].length - 1] += 1
    }
    return arr.sort((a, b) => a - b)[29]
}

다른 답:

function solution(strArr) {
  const counter = new Map();
  for (const str of strArr) {
    counter.set(str.length, (counter.get(str.length) || 0) + 1);
  }
  return Math.max(...counter.values());
}
function solution(strArr) {
    let ans = Array(31).fill(0);
    for (let s of strArr) ans[s.length]++
    return Math.max(...ans)
}

세 개의 구분자

임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.
예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.
문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.

function solution(myStr) {
    let arr = []
    let s = ''
    for(const str of [...myStr]) {
        if(str !== 'a' && str !== 'b' && str !== 'c') {
           s += str
        } 
        else {
            arr.push(s)
            s = ''
        }
    }
    if(s.length) arr.push(s)
    arr = arr.filter(v => v.length)
    if(arr.length < 1) arr.push('EMPTY')
    
    return arr
}

다른 답:

const solution = s => s.match(/[^a-c]+/g) || ['EMPTY']
function solution(myStr) {
    const list = myStr.split(/[a|b|c]/).filter(str => str);
    return list.length ? list : ["EMPTY"];
}
function solution(myStr) {
    const tmp1 = myStr.split("a").join("b")
    const tmp2 = tmp1.split("b").join("c")
    const tmp3 = tmp2.split("c").filter(x => x)
    if (tmp3.length === 0) return ["EMPTY"]
    return tmp3
}

split 후 join


2의 영역

정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.
단, arr에 2가 없는 경우 [-1]을 return 합니다.

function solution(arr) {

    let a = []
    let cnt = 0
    let two = arr.filter(v => v === 2).length
    
    if(two === 0) return [-1]
    
    // 짝수일 때 사이 값만 가져오기
    // if(two % 2 === 0) {
    //     for(let i = 0; i < arr.length; i++) {
    //         if(arr[i] === 2) {
    //             cnt++
    //         }
    //         if(cnt === 1) a.push(arr[i])    
    //         if(cnt === 2) {
    //             a.push(arr[i])
    //             cnt = 0
    //         }
    //     }        
    // } else {
    for(let i = 0; i < arr.length; i++) {
        if(arr[i] === 2) {
            cnt++
        }
        if(cnt === two) {
            a.push(arr[i])
            cnt = 0
        }
        if(cnt > 0) a.push(arr[i])    
    }  
    // }
    return a
}

다른 답:

function solution(arr) {
    const from = arr.indexOf(2);
    const end = arr.lastIndexOf(2);

    return from === -1 ? [-1] : arr.slice(from, end+1);
}
function solution(arr) {
  if (!arr.includes(2)) return [-1];

  let left = 0, right = arr.length - 1;
  while (arr[left] !== 2) left++;
  while (arr[right] !== 2) right--;

  return arr.slice(left, right + 1);
}

수열과 구간 쿼리4

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 i가 k의 배수이면 arr[i]에 1을 더합니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

function solution(arr, queries) {
    for(let i = 0; i < queries.length; i++) {
        for(let j = 0; j < arr.length; j++) {
            if(j >= queries[i][0] && j <= queries[i][1] && j % queries[i][2] === 0) arr[j] += 1
        }
    }
    return arr
}

다른 답:

function solution(arr, queries) {
    return queries.reduce((bucket, [s, e, k]) => {
        for (let i = s; i <= e; i += 1) {
            if (i % k === 0) bucket[i] += 1
        }
        return bucket
    }, [...arr])
}

reduce

function solution(arr, queries) {
    var answer = [];
    return queries.reduce((acc, [s, e, k]) => {
        return acc.map((a, idx) => {
            if (idx >= s && idx <= e && idx % k === 0) {
                return a + 1;
            }
            return a;
        });
    }, arr);
}

reduce + map

function solution(arr, queries) {
    queries.forEach(([s, e, k]) => {
        for (; s <= e; s++) {
            !(s % k) && arr[s]++;
        }
    });
    return arr;
}

forEach + for


배열의 길이를 2의 거듭제곱으로 만들기

정수 배열 arr이 매개변수로 주어집니다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.

function solution(arr) {
    let l = arr.length
    let cnt = 0
    
    while(l + cnt < Math.pow(2, Math.ceil(Math.log2(l)))) {
        arr.push(0)
        cnt++
    }
    return arr
}

다른 답:

function solution(arr) {
  const length = arr.length;
  const totalLength = 2 ** Math.ceil(Math.log2(length));
  return [...arr, ...new Array(totalLength - length).fill(0)];
}
function solution(arr) {
    return [...arr, ...Array(2 ** Math.ceil(Math.log2(arr.length)) - arr.length).fill(0)];
}
function solution(arr) {
    let N = 1
    while (N < arr.length) N *= 2
    while (arr.length < N) arr.push(0)
    return arr
}