"나는 무엇을 풀었는가" 시리즈는 이렇게 시작했습니다.

  1. 취업 준비 중 몇 번의 코딩테스트를 보며 깨달은 것이 있습니다. 바로 "기초가 중요하다"는 것입니다. 그리하여 프로그래머스 Level.0부터 차근차근 다시 풀어보려고 합니다.
  2. 단지 문제를 푸는 것보단, 왜 해당 함수를 썼는지 더 재사용이나 가독성을 높일 방법은 없는지, 그리고 해당 함수가 없다면 어떻게 풀 수 있을지와 같이 다양한 방법과 생각을 통해 사고력을 높이려고 노력합니다.
  3. 그럼 레츠 고 !

1. [프로그래머스] 배열의 길이를 2의 거듭제곱으로 만들기

문제설명 : arr의 길이가 2의 거듭 제곱이 되도록 arr에 최소한의 개수로 0을 추가한 배열을 리턴하세요.

입/출력 :

console.log(solution([1, 2, 3, 4, 5, 6])); // [1, 2, 3, 4, 5, 6, 0, 0]

Solution1

  • 2의 pow 배열을 미리 지정해준다.
  • pow 배열의 원소 중 arr.length보다 큰 값을 찾아 해당 값에 - arr.length한 값만큼 arr를 새로 만들어 0으로 채운다.
  • 기존 arr와 2번에서 만든 배열을 합쳐준다.
function solution(arr) {
    // 1.  2의 pow 배열을 미리 지정해준다.
    const powArr = [1,2,4,8,16,32,64,128,256,512,1024,2048];
    // 2. pow 배열의 원소 중 arr.length보다 큰 값을 찾아 해당 값에 - arr.length한 값만큼 배열을 새로 만들어 0으로 채운다.
    const arr2 = new Array(powArr.find(x => x >= arr.length) - arr.length).fill(0);
    // 3. 기존 arr와 2번에서 만든 배열을 합쳐 리턴한다.
    return [...arr, ...arr2];
}

2. [프로그래머스] 조건에 맞게 수열 변환하기 2

문제설명 : 정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.

입/출력 :

console.log(solution([1, 2, 3, 100, 99, 98])); // 5

Solution1

// 조건에 따라 연산하는 함수
function calculation(arr) {
  return arr.map((n) => {
    if (n >= 50 && n % 2 === 0) {
      return n / 2;
    }
    if (n < 50 && n % 2 === 1) {
      return n * 2 + 1;
    }
    return n;
  });
}

// 일치 여부를 확인하는 함수
function isAllSame(arr1, arr2) {
  return arr1.every((v, i) => v === arr2[i]);
}

function solution(arr) {
  let cnt = 0;
  let prevArr = arr; // 앞전 x-1 연산값
  let curArr = arr; // 현재 x번째 연산값

  while (true) {
    // 현재 값을 바꿔준다.
    curArr = calculation(arr);
    // 현재(x)번째 연산 값과 이전(x-1)번째 연산값이 같다면 while문을 빠져나간다.
    if (isAllSame(prevArr, curArr)) {
      break;
    }
    // 아니라면 x값을 1 증가시키고, prevArr값을 현재 값으로 갱신해준다.
    cnt++;
    prevArr = curArr;
  }

  return cnt;
}

3. [프로그래머스] 수열과 구간 쿼리 2

문제설명 : 2차원 배열 queries의 각 원소는 query를 나타내며 [s, e, k]꼴이다. arr.slice(s, e+1)을 했을 때, 각 요소 중 K보다 크면사 그 중 가장 작은 값을 새로운 배열에 담는다. query에 대해 2번 과정을 반복하며 만족하는 수가 없다면 -1을 배열에 담는다. 각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하세요.

입/출력 :

console.log(
  solution(
    [0, 1, 2, 4, 3],
    [
      [0, 4, 2],
      [0, 3, 2],
      [0, 2, 2],
    ]
  )
); //	[3, 4, -1]

Solution1 : slice + sort 활용

function f(arr, query) {
  const [s, e, k] = query;
  const filtered = arr
    .slice(s, e + 1)
    .filter((x) => x > k)
    .sort((a, b) => a - b);

  return filtered[0] !== undefined ? filtered[0] : -1;
}

function solution(arr, queries) {
  return queries.map((query) => f(arr, query));
}

Solution2 : filter와 Max.min 활용

function f(arr, query) {
    const [s, e, k] = query;
    const filtered = arr.filter((v, i) => s <= i && i <= e && v > k);
    
    return filtered.length ? Math.min(...filtered) : -1;
}

function solution(arr, queries) {
    return queries.map((query) => f(arr, query));
}

4. [프로그래머스] 문자열 여러 번 뒤집기

문제설명 : 2차원 배열 queries가 각 [s, e] 형태로 주어질 때, my_string의 인덱스 s부터 인덱스 e까지를 뒤집어 처리한 문자열을 리턴하세요.

입/출력 :

console.log(solution("abab", [[2, 3]])); // "abba"

Solution1

function solution(my_string, queries) {
  const str = my_string.split('');

  queries.forEach(([s, e]) => {
    const reverseStr = [...str.slice(s, e + 1)].reverse();
    str.splice(s, reverseStr.length, ...reverseStr);
  });

  return str.join('');
}

5. [프로그래머스] 왼쪽 오른쪽

문제설명 : 다음 조건에 맞는 배열을 리턴하세요.
조건 :

  • 'l'이 먼저 나온다면 --> l을 기준으로 왼쪽에 있는 요소를 담아 리턴
  • 'r'이 먼저 나온다면 --> r을 기준으로 오른쪽에 있는 요소를 담아 리턴
  • 둘 다 없다면 --> 빈 문자열 리턴

입/출력 :

console.log(solution(["u", "u", "l", "r"])); // ["u", "u"]

Solution1

function solution(str) {
  for (let i = 0; i < str.length; i++) {
    if (str[i] === "l") {
      return str.slice(0, i);
    }
    if (str[i] === "r") {
      return str.slice(i + 1);
    }
  }
  // l, r 둘다 없으면 빈배열 리턴
  return [];
}
profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글