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

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

1. [프로그래머스] 등차수열의 특정한 항만 더하기

문제설명 : 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요.

입/출력 :

console.log(solution(3, 4, [true, false, false, true, true])); // 37

Solution1

function solution(a, d, included) {
  let sequence = [];
  let answer = 0;

  // 등차 수열 만들기
  for (let i = a; i < a + i * d; i += d) {
    sequence.push(i);
    if (sequence.length === included.length) break;
  }

  // included가 true인 항들 더하기
  included.forEach((x, i) => (x ? (answer += sequence[i]) : 0));

  return answer;
}

Solution2 : 코드 단축

  • 등차수열 만드는 과정 생략하기
function solution(a, d, included) {
  let answer = 0;

  // 0 ~ included.length-1 까지 반복하면서
  for (let i = 0; i < included.length; i++) {
    // included[i]가 true라면 a + i * d 값을 answer에 더한다.
    if (included[i]) {
      answer += a + i * d;
    }
  }
  return answer;
}

2. [프로그래머스] 코드 처리하기

문제설명 : 문자열 code를 앞에서부터 읽으면서 code[i]가 '1'이라면 mode를 바꿔준다. 이 작업을 반복하며 결과로 문자열 ret을 만들어 리턴하세요.
조건 :

  • code의 문자가 1이면 mode를 바꾼다.
  • code[idx] !== '1' 일때 ret의 맨뒤에 code[idx] 추가
    • 단 mode가 0이라면 idx % 2 === 0 일 때만
    • 단 mode가 1이라면 idx % 2 === 1 일 때만
  • code[idx] === '1' 이라면 mode를 바꾼다.
    • mode가 0이라면 -> 1로
    • mode가 1이라면 -> 0으로

입/출력 :

console.log(solution("abc1abc1abc")); // "acbac"

Solution1 : 관심사 분리

// 짝수 또는 홀수 판별
function isEvenOrOdd(i, n) {
  return i % 2 === n;
}

function isEven(n) {
  return n % 2 === 0;
}

function isOdd(n) {
  return n % 2 === 1;
}

function solution(code) {
  const fs = [isEven, isOdd];
  let mode = 0;
  let ret = "";

  for (let i = 0; i < code.length; i++) {
    if (code[i] !== "1") {

      if (fs[mode](i)) {
        ret += code[i];
      }
    }

    if (code[i] === "1") {
      mode = mode === 0 ? 1 : 0;
    }
  }

  return ret.length > 0 ? ret : "EMPTY";
}

Solution2 : 특정 함수에 대한 의존성 제거하기

  • flag를 통해 checkMode 함수에 대해 isEvenOrOdd의 결과에 대한 의존성을 제거한다.
// 짝수 또는 홀수 판별
function isEvenOrOdd(i, n) {
  return i % 2 === n;
}

// mode를 확인해 code 반환
function checkMode(c, flag) {
  return flag ? c : '';
}

function solution(code) {
  let mode = 0;
  let ret = "";

  for (let i = 0; i < code.length; i++) {
    if (code[i] !== "1") {
      ret += checkMode(code[i], isEvenOrOdd(i, mode));
    }
    if (code[i] === "1") {
      mode = mode === 0 ? 1 : 0;
    }
  }
  
  return ret.length > 0 ? ret : "EMPTY";
}

3. [프로그래머스] 배열 조각하기

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

  • query[i]번 인덱스 = 짝수 : arr에서 query[i]번 인덱스 뒷부분을 잘라 버린다.
  • query[i]번 인덱스 = 홀수 : arr에서 query[i] 인덱스 앞부분을 잘라 버린다.

입/출력 :

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

Solution1

function spliceArr (result, a, b) {
  return result.splice(a, b);
}

function solution(arr, query) {
    let result = [...arr];
    
    for (let i = 0 ; i < query.length; i++) {
        i % 2 === 0 ? 
            spliceArr(result, query[i]+1, arr.length) 
            : spliceArr(result, 0, query[i]);
    }
    
    return result;
}

Solution2 : 관심사 분리하기

function subArr(arr, s, e) {
    const result = [];
    if (e > arr.length) {
        e = arr.length;
    }
    for (let i = s; i < e; i++) {
        result.push(arr[i]);
    }
    return result;
}

function solution(arr, query) {
    let result = [...arr];

    for (let i = 0; i < query.length; i++) {
        result = i % 2 === 0
            ? subArr(result, 0, query[i] + 1) // 뒷부분
            : subArr(result, query[i], arr.length); // 앞부분
        console.log(result);
    }

    return result;
}

4. [프로그래머스] 주사위 게임 3

입/출력 :

console.log(solution(2, 2, 2, 2)); // 2222
console.log(solution(4, 1, 4, 4)); // 1681
console.log(solution(6, 3, 3, 6)); // 27
console.log(solution(2, 5, 2, 6)); // 30
console.log(solution(6, 4, 2, 5)); // 2

Solution1 : switch 문 활용하기

function doDice(arr) {
  const diceKeys = Object.keys(arr);
  const diceValues = Object.values(arr);
  const threeNumSame = diceValues.map((v, i) => v !== 2 ? diceKeys[i] : "").filter(v => v !== "");

  switch (diceKeys.length) {
    case 1: return 1111 * diceKeys;
    case 2: return twoDice(diceKeys, diceValues);
    case 3: return Number(threeNumSame[0]) * Number(threeNumSame[1]);
    case 4: return Math.min(...diceKeys);
  }
}

function twoDice(diceKeys, diceValues) {
  const a = Number(diceKeys[0]);
  const b = Number(diceKeys[1]);

  if (diceValues[0] === diceValues[1]) {
    return (a + b) * Math.abs(a - b);
  } else {
    return (diceValues[0] > diceValues[1]) ?  Math.pow(10  * a + b, 2) : Math.pow(10 * b + a, 2);
    }
}

function solution(a, b, c, d) {
  const arr = [a, b, c, d].reduce(
    (ac, v) => ({...ac, [v]: (ac[v] || 0) + 1}),
    {}
  );

  return doDice(arr);
}

5. [프로그래머스] 평균 구하기

문제설명 : 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

입/출력 :

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

Solution1

function solution(arr) {
    return arr.reduce((acc, cur) => (acc+cur), 0) / arr.length;
}
profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글