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

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

1. [프로그래머스] 공백으로 구분하기 2

문제설명 : 하나 이상의 공백으로 구분된 문자열의 각 단어를 담은 배열을 리턴하세요.

입/출력 :

console.log(solution(" i    love  you")); // ["i", "love", "you"]

Solution1

  • my_string을 split을 통해 공백으로 구분한 후 반복문을 통해 i번째 요소가 빈 문자열이 아니라면 arr에 담는다.
  • 그리고 담은 arr를 리턴한다.
function solution(my_string) {
  let str = my_string.split(" ")
  let arr = [];

  for (let i = 0; i < str.length; i++) {
    if (str[i] !== "" ) {
      arr.push(str[i])
    }
  }
  return arr;
}

Solution2

  • match() 메서드를 사용해 정규식과 매칭되는 부분을 검색한 후, 결과값을 배열로 반환한다.
  • 이때 정규표현식에서 "\s"는 공백 문자를 의미한다.
function solution(my_string) {
  let result = my_string.match(/[^\s]+/g);

  return result;
}

2. [프로그래머스] 원소들의 합과 곱

문제설명 : 모든 원소들의 곱이 모든 원소들의 합의 제곱보다 작으면 1을 크면 0을 리턴하세요.

입/출력 :

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

Solution1

  • 반복문을 돌면서 sum엔 더하고, total엔 곱한다.
  • 그 후 sum의 값이 더 크다면 1을 아니라면 0을 리턴한다.
function solution(num_list) {
  let sum = 0;  //합
  let total = 1; //곱

  for (let i = 0; i < num_list.length; i++) {
    sum += num_list[i];
    total *= num_list[i];
  }
  sum = sum * sum;

  return total < sum ? 1 : 0;
}

Solution2 : 함수 분리하기

  • 수를 더하는 sum 함수와 수를 곱하는 multi함수를 구현한다.
  • 그리고 위 두 함수의 공통적인 일을 하는 f 함수를 구현해 arr과 초기값, 함수를 인자로 넘겨준다.
  • f함수는 반목문을 돌면서 전달 받은 함수에 따라 초기값과 arr[i]번째 요소를 더하거나 곱하는 일을 수행한다.
  • 그리고 결과값을 각 변수 a, b에 할당하여 대소관계를 비교하여 리턴한다.
function f(arr, result, fn) {
  for (let i = 0; i < arr.length; i++) {
    result = fn(result, arr[i]);
  }

  return result;
}

function sum(arr) {
  return f(arr, 0, (a, b) => a + b);
}


function multi(arr) {
  return f(arr, 1, (a, b) => a * b);
}

function solution(num_list) {
  let a = sum(num_list);  //합
  let b = multi(num_list); //곱

  a = a * a;

  return b < a ? 1 : 0;
}

3. [프로그래머스] 공배수

문제설명 : number가 n의 배수이면서 m의 배수이면 1을 아니라면 0을 리턴하세요.

입/출력 :

console.log(solution(60, 2 ,3)); // 1

Solution1

function solution(number, n, m) {
  return (number % n === 0 && number % m === 0) ? 1 : 0;
}

4. [프로그래머스] 문자열의 앞의 n글자

문제설명 : my_string의 앞의 n글자로 이루어진 문자열을 리턴하세요.

입/출력 :

console.log(solution("ProgrammerS123", 11)) // "ProgrammerS"

Solution1

function solution(my_string, n) {
  return my_string.slice(0, n);
}

5. [프로그래머스] 배열의 길이에 따라 다른 연산하기

문제설명 : arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을, arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 리턴하세요.

입/출력 :

console.log(solution([49, 12, 100, 276, 33],	27)); // [76, 12, 127, 276, 60]

Solution1

  • arr길이가 짝수라면 모든 홀수 인덱스 요소에 n을 더한 배열을 리턴한다.
  • 홀수라면 모든 짝수 인덱스 요소에 n을 더한 배열을 리턴한다.
function solution(arr, n) {
  if (arr.length % 2 === 0) {
    return arr.map((el, idx) => (idx % 2 === 1) ? el + n : el);
  } else {
    return arr.map((el, idx) => (idx % 2 === 0) ? el + n : el);
  }
}

Solution2

  • 배열의 길이가 홀수라면 모든 짝수 인덱스 요소에 n을 더한 배열을 리턴한다. 짝수라면 반대로 실행한다.
function solution(arr) {
    for (let i = 0; i < arr.length; i ++) {
      if (arr.length % 2 === 1) {
        // 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을
        for (let i = 1; i < arr.length; i += 2) {
          arr.replace(arr[i], arr[i] + n);
        }
      }
      else {
        // 짝수라면, arr의 모든 홀수 인덱스의 n을 더한 배열을 리턴하라
        for (let i = 0; i < arr.length; i += 2) {
          arr.replace(arr[i], arr[i] + n);
        }
      }
    }
  return arr;
}

6. [해커랭크] Caesar Cipher

문제설명 : 문자열 s의 각 요소를 k만큼 shift된 문자열을 리턴하세요. 이때 알파벳 끝을 넘는다면 알파벳의 맨 앞으로 넘겨집니다.

입/출력 :

console.log(caesarCipher('middle - Outz', 2)); // okffng - Qwvb

Solution1

  • 각 요소는 대소문자를 구분하기 때문에 소문자 알파벳 문자열과 이를 toUpperCase한 대문자 알파벳 문자열을 각 변수에 담는다.
  • 각 요소를 돌면서 각 요소가 소문자 혹은 대문자 문자열에 속한다면 해당 index & 26한 값으로 바꿔준다.
  • 이때 요소가 알파벳이 아니라면 그대로 넣어준다.

% 26를 하는 이유

  • z + k를 하게 되면 알파벳.length를 넘어가게 된다.
  • -> 이때 (% 26)를 하게 되면, 26 -> 27이 되는게 아니라, 다시 1로 넘어간다.
  • 따라서 26이 넘지 않은 인덱스는 영향 받지 않지만 --> 16 % 26 = 16;
  • 26이 넘어가는 인덱스는 해당 값에 - 26 처리 된다 --> 29 % 26 = 3;
function caesarCipher(s, k) {
  const lowAlpha = "abcdefghijklmnopqrstuvwxyz";
  const upperAlpha = lowAlpha.toUpperCase();

  const trans = s.split("").map(letter => {
    if (lowAlpha.includes(letter)) {
      return lowAlpha[(lowAlpha.indexOf(letter) + k) % 26];
    } else if (upperAlpha.includes(letter)) {
      return upperAlpha[(upperAlpha.indexOf(letter) + k) % 26];
    } else {
      return letter; // 알파벳이 아닌 특수 기호라면,
    } 
  });
  return trans.join("");
}

7. [해커랭크] Lonely Integer

문제설명 : 배열의 원소 중 고유한 요소를 찾아 리턴하세요.

입/출력 :

console.log(lonelyinteger([1,2,3,4,5,2,1])); // 4

Solution1

  • filter를 통해 배열 내 중복되는 원소를 담은 배열을 double에 담는다.
  • a 배열의 원소를 돌면서 중복 원소를 담은 double 배열에 포함되지 않은 원소를 담은 배열을 리턴한다.
function lonelyinteger(a) {
    const double = a.filter((item, idx) => a.indexOf(item) !== idx);
    const result = a.filter((item) => !double.includes(item));
    
    return String(result);
}

8. [해커랭크] Max Min

문제설명 : n개의 값을 가진 배열 arr에서 k만큼 값을 선택했을 때, Max(arr) - Min(arr) 값이 가장 작은 경우의 값을 리턴하세요.

입/출력 :

console.log(maxMin(2, [1, 4, 7, 2])); // 1

Solution1

  • sort 함수를 통해 각 요소를 오름차순으로 정렬한다.
  • 정렬된 각 원소를 돌면서 우측 요소에서 좌측 요소를 뺀 값을 result 배열에 푸시한다.
  • result 배열의 요소 중 가장 작은 값을 리턴한다.
function maxMin(k, arr) {
  const sortedArr = arr.sort((a, b) => a - b);
  const result = [];

  for (let i = 0; i <= sortedArr.length - k; i++) {
    const point = sortedArr[i + k - 1] - sortedArr[i];
    result.push(point);
  }
  return Math.min(...result);
}

문제가 많아, 上 / 下 편으로 나눕니다.
👉 7월 첫주 下편에서 계속...

profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글