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

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

1. [프로그래머스] 할 일 목록

문제설명 : 오늘 해야 할 일이 담긴 문자열 배열 todo_list와 각각의 일을 지금 마쳤는지를 나타내는 boolean 배열 finished가 매개변수로 주어질 때, todo_list에서 아직 마치지 못한 일들을 순서대로 담은 문자열 배열을 리턴하세요.

입/출력 :

console.log(solution(
    ["problemsolving", "practiceguitar", "swim", "studygraph"],
    [true, false, true, false])); // ["practiceguitar", "studygraph"]

Solution1

function solution(todo_list, finished) {
  let result = todo_list.filter((_, idx) => finished[idx] === false);
  return result;
};

Solution2 : filter 직접 구현하기

function solution(todo_list, finished) {
  let arr = [];

  for (let i = 0; i < todo_list.length; i++) {
    if (finished[i] === false) {
      arr.push(todo_list[i]);
    }
  }
  return arr;
}

2. [프로그래머스] A 강조하기

문제설명 : myString에서 알파벳 "a"가 등장하면 전부 "A"로 변환하고, "A"가 아닌 모든 대문자 알파벳은 소문자 알파벳으로 변환해 리턴하세요.

입/출력 :

console.log(solution("PrOgRaMmErS")) // "progrAmmers"

Solution1 : replaceAll 활용하기

function solution(myString) {
  return myString.toLowerCase().replaceAll('a', 'A');
}

Solution2 : replaceAll 직접 구현하기

function solution(myString) {
  let result = "";
  
  for (let i = 0; i < myString.length; i++) {
      if (myString[i] === 'a' || myString[i] === 'A') {
        result += "A";
      } else {
        result += myString[i].toLowerCase();
      }
  }
  return result;
}

3. [프로그래머스] 글자 이어 붙여 문자열 만들기

문제설명 : my_string의 index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 리턴하세요.

입/출력 :

console.log(solution("zpiaz",	[1, 2, 0, 0, 3])); // "pizza"

Solution1

function solution(my_string, index_list) {
  return index_list.map(i => my_string[i]).join('');
}

Solution2 : Map 직접 구현하기

function solution(my_string, index_list) {
  let answer = "";
  for (let i of index_list) {
    answer += my_string[i]
  }
  return answer;
}

4. [프로그래머스] 문자열 곱하기

문제설명 : my_string을 k번 반복한 문자열을 리턴하세요.

입/출력 :

console.log(solution("string", 3)); // "stringstringstring" 

Solution1

function solution(my_string, k) {
  return my_string.repeat(k);
}

Solution2 : repeat 직접 구현하기

function solution(my_string, k) {
  let answer = "";
    for (let i = 0; i < k; i++) {
      answer += my_string;
    }
  return answer;
}

5. [프로그래머스] 문자열 정수의 합

문제설명 : 한 자리 정수로 이루어진 문자열 num_str이 주어질 때, 각 자리수의 합을 리턴하세요.

입/출력 :

console.log(solution("123456789"));	// 45

Solution1

function solution(num_str) {
    return [...num_str].map(Number).reduce((acc, cur) => acc + cur, 0);
}

Solution2 : reduce 직접 구현하기

function solution(num_str) {
    let answer = 0;
    
    for (let num of num_str) {
        answer += Number(num);
    }
    return answer;
}

6. [프로그래머스] 정수 찾기

문제설명 : num_list안에 n이 있으면 1을 없으면 0을 리턴하세요.

입/출력 :

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

Solution1

function solution(num, n) {
  if (num.includes(n)) {
      return 1;
  } else {
      return 0;
  }
}

Solution2 : includes 직접 구현하기

function solution(num, n) {
    for (let i of num) {
        if (i === n) {
            return 1;
        }
    }
    return 0;
}

7. [프로그래머스] 특정한 문자를 대문자로 바꾸기

문제설명 : my_string에서 alp에 해당하는 모든 글자를 대문자로 바꾼 문자열을 리턴하세요.

입/출력 :

console.log(solution("programmers", "p")); // "Programmers"

Solution1

function solution(my_string, alp) {
  return my_string.replaceAll(alp, alp.toUpperCase());
}

Solution2 : replaceAll 직접 구현하기

function solution(my_string, alp) {
  let arr = Array.prototype.slice.call(my_string);
  
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === alp) {
      arr[i] = arr[i].toUpperCase();
    } 
  }
  return arr.join("");
}

8. [프로그래머스] 간단한 식 계산하기

문제설명 : binomial은 "a op b" 형태의 이항식이고 a와 b는 음이 아닌 정수, op는 '+', '-', '*' 중 하나입니다. 주어진 식을 계산한 정수를 리턴하세요.

입/출력 :

console.log(solution("43 + 12")); // 55

Solution1

const add = (a, b) => Number(a) + Number(b);
const minus = (a, b) => Number(a) - Number(b);
const multi = (a, b) => Number(a) * Number(b);

function solution(binomial) {
  const [a, op, b] = binomial.split(" ");
  let sign = ["+", '-', '*'];
  const f = (op === sign[0]) ? add : (op === sign[1]) ? minus : multi;

  return f(a, b);
}

Solution2 : 객체 활용하기

const ops = {
  "+": (a, b) => a + b,
  "-": (a, b) => a - b,
  "*": (a, b) => a * b,
}

function solution(binomial) {
  const [a, op, b] = binomial.split(" ");

  return ops[op](Number(a), Number(b));
}

9. [프로그래머스] l로 만들기

문제설명 : 파벳 순서에서 "l"보다 앞서는 모든 문자를 "l"로 바꾼 문자열을 리턴하세요.

입/출력 :

console.log(solution("abcdevwxyz")); // "lllllvwxyz"

Solution1

  • myString[i]가 beforeL에 포함되면 l로 바꾸어 push한다.
function solution(myString) {
    const beforeL = "abcedfghijk";
    let answer = [];

    for (let i = 0; i < myString.length; i++) {
        if (beforeL.includes(myString[i])) {
            answer.push("l");
        } else {
            answer.push(myString[i]);
        }
    }
    return answer.join("");
}

Solution2 : 알파벳 대소비교

  • 알파벳도 대소비교가 가능하다!
  • "a" > "b" // --> false
  • "a" < "b" // --> true
function solution(myString) {
    // myString을 배열로 만든 후 각 원소를 돌면서 원소보다 l이 크다면, 즉 l보다 이전의 알파벳이라면 l로 바꾼다.    
    let answer = [...myString].map(el => el < 'l' ? 'l' : el).join("");
    
    return answer;
}

10. [프로그래머스] x 사이의 개수

문제설명 : myString을 문자 "x"를 기준으로 나눴을 때 나눠진 문자열 각각의 길이를 순서대로 저장한 배열을 리턴하세요.

입/출력 :

console.log(solution("oxooxoxxox")); // [1, 2, 1, 0, 1, 0]

Solution1

  1. 각 원소의 길이를 체크할 변수 leng와 정답을 리턴할 배열 answer을 선언한다.
  2. 각 원소를 돌면서 원소가 "x"가 아니라면 leng+1을 해준다.
  3. 만약 원소가 "x"라면 현재 leng를 answer에 푸시하고 leng을 초기화한다.
  4. edge case
    • leng에 남겨진 값이 있을 경우(leng가 0보다 클 경우) -> answer.push(leng)
    • 마지막 원소가 'x'일 경우 -> answer.push(0)
function solution(myString) {
  let leng = 0;
  let answer = [];
  let str = [...myString];
  
  for(let i = 0; i < str.length; i++) {
    if (str[i] !== "x") {
      leng++;
    } else {
      answer.push(leng);
      leng = 0;
    }
  }
  
  // edge case) 1.leng가 남아있을 경우 2. 마지막 원소가 'x'일 경우
  if (leng > 0) {
    answer.push(leng);
  } else if ((str[str.length-1]) === "x"){
    answer.push(0);
  }
  
  return answer;
}

Solution2 : split + map 이용하기

  • "x" 기준으로 잘라준 후, 각 요소의 길이로 값을 바꾼다.
function solution(myString) {
  let answer = myString.split('x').map(el => el.length);

  return answer;
}
profile
한입 크기로 베어먹는 개발지식 🍰

2개의 댓글

comment-user-thumbnail
2023년 7월 24일

잘 읽었습니다. 좋은 정보 감사드립니다.

1개의 답글