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

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

1. [프로그래머스] 더 크게 합치기

문제설명 : 양의 정수 a와 b가 주어졌을 때, a ⊕ b와 b ⊕ a 중 더 큰 값을 리턴하세요.

입/출력 :

console.log(solution(9, 91)); // 991

Solution1

  • a-b와 b-a를 만들어 Number 타입으로 변환 후 대소비교한다.
function solution(a, b) {
  const aByb = Number(String(a) + b);
  const bBya = Number(String(b) + a);

  return aByb > bBya ? aByb : bBya;
}

Solution2 : 공통작업 분리

  • 공통 작업을 수행하는 함수 f를 만든다.
  • 함수 f : arg를 문자열로 변환한 후 합친 다음 다시 숫자로 변환하는 함수
function f(...args) {
  return Number(args.map(String).reduce((a, b) => a + b));
}

function solution(a, b) {
  const aByb = f(a, b);
  const bBya = f(b, a);

  return aByb > bBya ? aByb : bBya;
}

2. [프로그래머스] 두 수의 연산값 비교하기

문제설명 : 정수 a와 b가 주어졌을 때, a ⊕ b와 2 a b 중 더 큰 값을 리턴하세요.

입/출력 :

console.log(solution(2, 91)); // 364 

Solution1

function solution(a, b) {
  const stickNum = Number(String(a) + b);
  const twoByNum = 2 * a * b;

  return stickNum > twoByNum ? stickNum : twoByNum;
}

Solution2 : 공통작업 분리

  • 공통된 작업을 수행하는 함수 f를 만든다.
  • 함수 f : arg를 문자열로 변환한 후 합친 다음 다시 숫자로 변환한다.
function f(...args) {
  return Number(args.map(String).reduce((a, b) => a + b));
}

function solution(a, b) {
  const stickNum = f(a, b);
  const twoByNum = 2 * a * b;

  return stickNum > twoByNum ? stickNum : twoByNum;
}

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

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

입/출력 :

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

Solution1

function solution(arr, n) {
  // 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);
  }
}

4. [프로그래머스] 커피 심부름

문제설명 : 각 직원이 적은 메뉴가 문자열 배열 order로 주어질 때, 카페에서 결제하게 될 금액을 리턴하세요.

가격표 :

  • 아메리카노 → 4,500
  • 카페라테 → 5,000
  • 아무거나 → 아메리카노

입/출력 :

console.log(solution(["cafelatte", "americanoice", "hotcafelatte", "anything"])); // 19000

Solution1

  • order 배열에 map을 돌려 각 요소를 calulate 함수에 전달한다.
  • calulate 함수에는 각 요소에 "cafelatte"가 들어 있으면 5,000원을, 아니라면 4,500원을 리턴한다.
  • 주문을 가격으로 변환한 값을 배열 price에 담고 reduce를 통해 모든 요소의 누적 값을 리턴한다.
function calculate(order) {
  return order.includes("cafelatte") ? 5000 : 4500;
}

function solution(order) {
  let price = order.map((el) => calculate(el));
    
  return price.reduce((acc, cur) => (acc + cur), 0);
}

Solution2 : map, reduce 직접 구현하기

  • 반복문을 통해 요소들 돌면서 "cafelatte"가 들어 있으면 5,000원을, 아니라면 4,500원을 변수 result에 누적하여 최종 리턴한다.
function solution(order) {
  let result = 0;

  for (let i = 0; i < order.length; i++) {
    result += order[i].includes("cafelatte") ? 5000 : 4500;
  }

  return result;
}

5. [프로그래머스] 홀수 vs 짝수

문제설명 : 홀수 번째 원소들의 합과 짝수 번째 원소들의 합 중 큰 값을 리턴하세요.

입/출력 :

console.log(solution([4, 2, 6, 1, 7, 6])); // 17

Solution1

  • filter와 reduce 함수 활용
  // 홀수번째 원소들의 합(짝수 인덱스)
  let oddSum = num_list.filter((el, idx) => idx % 2 === 0).reduce((acc, cur) => acc + cur, 0);
   // 짝수번째 원소들의 합(홀수 인덱스)
  let evenSum = num_list.filter((el, idx) => idx % 2 === 1).reduce((acc, cur) => acc + cur, 0);
  
  return oddSum > evenSum ? oddSum : evenSum;
}

Solution2 : 관심사 분리

  • 배열 안의 값을 누적적으로 더하는 공통 작업을 하는 함수 sum을 구현한다.
  • oddSum/evenSum : num_list 배열에 filter를 거쳐 홀수 요소만 또는 짝수 요소만 걸러 sum 함수에 전달한다.
function sum(arr){
  return arr.reduce((acc, cur) => acc + cur, 0);
}

function solution(num_list) {

    const oddSum = sum(num_list.filter((_, idx) => idx % 2 === 0));
    const evenSum = sum(num_list.filter((_, idx) => idx % 2 === 1));

    return oddSum < evenSum ? evenSum : oddSum;
}

6. [프로그래머스] 글자 지우기

문제설명 : my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 리턴하세요.

입/출력 :

console.log(solution("apporoograpemmemprs", [1, 16, 6, 15, 0, 10, 11, 3])); // "programmers"

Solution1

function solution(my_string, indices) {
  return [...my_string].filter((_, i) => !indices.includes(i)).join('');
}

Solution2 : filter 직접 구현하기

function solution(my_string, indices) {
  let result = [];
  
  for (let i = 0; i < my_string.length; i++) {
    if (!indices.includes(i)) {
      result.push(my_string[i]);
    }
  }
  return result.join("");
}

7. [프로그래머스] 배열 만들기 3

문제설명 : 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 리턴하세요.

입/출력 :

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

Solution1 : reduce & concat 활용하기

function solution(arr, intervals) {
  return intervals
      .map(([a, b]) => arr.slice(a, b + 1))
      .reduce((a, b) => a.concat(b));
}

Solution2 : flat 함수 활용하기

function solution(arr, intervals) {
  return intervals
      .map(([a, b]) => arr.slice(a, b + 1))
      .flat(); // 2차원 배열을 풀어 -> 1차원 배열로 만들어준다.
}

Solution3 : 구조분해 할당과 spread 연산자 활용하기

function solution(arr, intervals) {
  const [[a1, b1], [a2, b2]] = intervals;
  
  return [...arr.slice(a1, b1 + 1), ...arr.slice(a2, b2 + 1)];
}

8. [프로그래머스] 배열 만들기 5

문제설명 : 배열 intStrs의 각 원소마다 s번 인덱스에서 시작하는 길이 l짜리 부분 문자열을 잘라내 정수로 변환합니다. 이때 변환한 정수값이 k보다 큰 값들을 담은 배열을 리턴하세요.

입/출력 :

console.log(solution(["0123456789","9876543210","9999999999999"], 50000, 5, 5)); // [56789, 99999]

Solution1

function solution(intStrs, k, s, l) {
  // 1. 각 원소마다 s번째 인덱스부터 s + 1까지 문자열을 잘라 정수로 변환한다.
  let mapping = intStrs.map((num) => parseInt(num.slice(s, s+l)));
  //2. 각 원소를 돌면서 원소가 k보다 큰 값을 담은 배열을 담아 리턴한다.
  return mapping.filter((el) => el > k);
}

Solution2

function solution(intStrs, k, s, l) {
  return intStrs
      .map((num) => parseInt(num.slice(s, s+l), 10))
      .filter((el) => el > k);
}
`parseInt`를 사용할 때 두번째 인자로 몇 진법으로 변환할 건지 정해주는 것이 좋다.

9. [프로그래머스] 특별한 이차원 배열 1

문제설명 : n × n 크기의 이차원 배열 arr를 리턴하세요.

입/출력 :

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

Solution1

  • 반복문을 돌면서 0으로 채운 배열을 n만큼 만들어주고 arr[i]값을 1로 바꿔준다.
function solution(n) {
  const arr = [];

  for (let i = 0; i < n; i++) {
    const temp = Array(n).fill(0);
    temp[i] = 1;
    arr.push(temp);   
  }
  return arr;
}

Solution2 : Array.from 활용하기

  • Array.from을 활용해 0으로 채운 n X n 배열을 만들어준다.
  • 다음 반복문을 돌면서 arr[i][i] 값을 1로 바꿔준다.

    Array.from : Array.from(배열로 변환하고자 하는 유사 배열 객체, 배열의 모든 요소에 호출할 맵핑 함수)

function solution(n) {
  let arr = Array.from(Array(n), () => Array(n).fill(0));

  for (let i = 0; i < n; i++) {
    arr[i][i] = 1;
  }
  return arr;
}

10. [프로그래머스] 특별한 이차원 배열 2

문제설명 : n × n 크기의 이차원 배열 arr이 매개변수로 주어질 때, arr이 다음을 만족하면 1을 아니라면 0을 리턴하세요.

조건 : arr[i][j] = arr[j][i]

입/출력 :

console.log(solution([
    [5, 192, 33],
    [192, 72, 95],
    [33, 95, 999]
])); // 1

Solution1 : 이중 반복문


function solution(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < i; j++) {
      if (arr[i][j] !== arr[j][i]) {
        return 0;
      } 
    }
  }
  return 1;
}

Solution2 : true/false를 판별하는 flag 활용하기

  • 반복문을 돌면서 arr[i][j]와 arr[j][i]가 일치하지 않다면 flag를 false로 바꿔준다.
function solution(arr) {
    let flag = true;

    for (let i = 0; i < arr.length; i++) {
        for (let j = 0; j < i; j++) {
            // console.log(arr[i][j], arr[j][i], arr[i][j] === arr[j][i]);

            if (arr[i][j] !== arr[j][i]) {
                flag = false;
            }
        }
    }
    return flag ? 1 : 0;
}
profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글