JavaScript - 프로그래머스 레벨 : 0(23) - Relatively New

먹보·2024년 3월 25일
0
post-thumbnail

오랜만에 시작되는 코딩테스트 23년 4월에 취 후 1년동안 개인적으로 적응의 시간을 가지고 돌아왔다.

이제는 다시 시작해야 할 때, 1년 동안 쌓인 지식을 마음껏 풀어보자

다시 0레벨부터 차근차근

1. 접미사인지 확인하기

문제 설명

어떤 문자열에 대해서 접미사는 특정 인덱스부터 시작하는 문자열을 의미합니다. 예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다.
문자열 my_string과 is_suffix가 주어질 때, is_suffix가 my_string의 접미사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.

예제

코드

function solution(my_string, is_suffix) {
  for (let wordLength = my_string.length-1 ; wordLength >= 0 ; --wordLength) {
    if (is_suffix === my_string.slice(wordLength)) {
      return 1;
    }
  }
  return 0;
}

//다른 풀이
const solution = (str, suff) => str.endsWith(suff) ? 1 : 0

🗒️코멘트

자바스크립트의 "startsWith"와 "endsWith"를 사용할 수 있게 나온 문제 같다.

이 문법을 모르면 for문을 사용해 풀거나 조금 돌아가는 비효율적인 방법을 택할 것 같다.


2. 접두사인지 확인하기

문제 설명

어떤 문자열에 대해서 접두사는 특정 인덱스까지의 문자열을 의미합니다. 예를 들어, "banana"의 모든 접두사는 "b", "ba", "ban", "bana", "banan", "banana"입니다.
문자열 my_string과 is_prefix가 주어질 때, is_prefix가 my_string의 접두사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.

예제

코드

function solution(my_string, is_suffix) {
  return my_string.startsWith(is_suffix) ? 1 : 0
}

🗒️코멘트

간단하게 "startsWith"로 구현


3. 더 크게 합치기

문제 설명

연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.

  • 12 ⊕ 3 = 123
  • 3 ⊕ 12 = 312

양의 정수 a와 b가 주어졌을 때, a ⊕ b와 2 a b 중 더 큰 값을 return하는 solution 함수를 완성해 주세요.

단, a ⊕ b와 2 a b가 같으면 a ⊕ b를 return 합니다.

예제

코드

function solution(a,b) {
  const calculationA = Number(a.toString() + b.toString());
  const calculationB = 2*a*b
  const result = calculationA - calculationB
  if (result > 0) {
    return calculationA
  } else if (result < 0) {
    return calculationB
  } else {
    return calculationA
  }
}

🗒️코멘트


4. n개 간격의 원소들

문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 마지막 원소까지 n개 간격으로 저장되어있는 원소들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

예제

코드

function solution(num_list, n) {
  return num_list.filter((el, i) => {
    if (i % n === 0) {
      return el
    }
  })
}

🗒️코멘트


5. 글자 이어 붙여 문자열 만들기

문제 설명

문자열 my_string과 정수 배열 index_list가 매개변수로 주어집니다. my_string의 index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

예제

코드

function solution (my_string, index_list) {
  let newString = "";
  index_list.forEach((el) => newString += my_string[el])
  return newString;
}

🗒️코멘트


6. 특정한 문자를 대문자로 바꾸기

문제 설명

영소문자로 이루어진 문자열 my_string과 영소문자 1글자로 이루어진 문자열 alp가 매개변수로 주어질 때, my_string에서 alp에 해당하는 모든 글자를 대문자로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.

예제

코드

function solution(my_string, alp) {
    return my_string.split('').map((el) => {if (el === alp) {
        return el.toUpperCase()
    } else {
      return el
    }}).join('')
}

//다른 풀이
const solution=(s,a)=>s.replaceAll(a,a.toUpperCase())

🗒️코멘트

오랜만에 풀었더니 감을 잃은 것 같다. replaceAll이란 method를 앎에도 불구하고 굳이 배열에서 다시 스트링으로 바꾸는 과정을 걷히다니 많이 무뎌졌다.


7. 5명씩

문제 설명

최대 5명씩 탑승가능한 놀이기구를 타기 위해 줄을 서있는 사람들의 이름이 담긴 문자열 리스트 names가 주어질 때, 앞에서 부터 5명씩 묶은 그룹의 가장 앞에 서있는 사람들의 이름을 담은 리스트를 return하도록 solution 함수를 완성해주세요. 마지막 그룹이 5명이 되지 않더라도 가장 앞에 있는 사람의 이름을 포함합니다.

예제

코드

function solution(names) {
    return names.filter((el, i) => {
        if (i % 5 === 0) {
            return el
        }
    })
}

// 다른 풀이
function solution(names) {
    var answer = [];
    for(let i = 0; i < names.length; i += 5){
        answer.push(names[i])
    }
    return answer;
}

🗒️코멘트

시간 복잡도 관점에서 보자면, 모든 원소를 한 번씩 접근하는 filter 메서드 보다는 인덱스를 5단위로 건너 뛰는 밑의 for문이 더 나아보이지만 가독성 측면에서는 filter 메서드가 더 간결하다.


8. A 강조하기

문제 설명

문자열 myString이 주어집니다. myString에서 알파벳 "a"가 등장하면 전부 "A"로 변환하고, "A"가 아닌 모든 대문자 알파벳은 소문자 알파벳으로 변환하여 return 하는 solution 함수를 완성하세요.

예제

코드

function solution(myString) {
    return myString.replaceAll('a', 'A').split('').map((el) => {
        if (el !== 'A' && el !== 'a') {
            return el.toLowerCase()
        } else {
          return el
        }
    }).join('')
}

//다른 풀이
const solution=s=>s.toLowerCase().replaceAll('a','A');

🗒️코멘트

조금만 더 생각해보면 배열 전환 없이 풀 수 있는 문제


9. 배열 비교하기

문제 설명

이 문제에서 두 정수 배열의 대소관계를 다음과 같이 정의합니다.

  • 두 배열의 길이가 다르다면, 배열의 길이가 긴 쪽이 더 큽니다.
  • 배열의 길이가 같다면 각 배열에 있는 모든 원소의 합을 비교하여 다르다면 더 큰 쪽이 크고, 같다면 같습니다.

두 정수 배열 arr1과 arr2가 주어질 때, 위에서 정의한 배열의 대소관계에 대하여 arr2가 크다면 -1, arr1이 크다면 1, 두 배열이 같다면 0을 return 하는 solution 함수를 작성해 주세요.

예제

코드

function solution(arr1, arr2) {
    if (arr1.length !== arr2.length) {
        return arr1.length > arr2.length ? 1 : -1;
    }
    
    const sumArr1 = arr1.reduce((acc, curr) => acc + curr, 0);
    const sumArr2 = arr2.reduce((acc, curr) => acc + curr, 0);
    
    if (sumArr1 !== sumArr2) {
        return sumArr1 > sumArr2 ? 1 : -1;
    }
    
    return 0;
}

🗒️코멘트

if문을 짤라 가독성 있게 풀어 쓴 코드

예전 같았으면 if문을 여러 개 두어 가독성 떨어진 코드를 작성했을 것이다.


10. 홀수 vs 짝수

문제 설명

정수 리스트 num_list가 주어집니다. 가장 첫 번째 원소를 1번 원소라고 할 때, 홀수 번째 원소들의 합과 짝수 번째 원소들의 합 중 큰 값을 return 하도록 solution 함수를 완성해주세요. 두 값이 같을 경우 그 값을 return합니다.

예제

코드

function solution(num_list) {
    let evenSum = 0;
    let oddSum = 0;
    num_list.forEach((el, i) => {
        i++
        if (i % 2 === 0) {
            evenSum += el
        } else {
            oddSum += el
        }
    })
    return Math.max(evenSum, oddSum)
}

🗒️코멘트


오랜만에 돌아와 문제를 풀었더니 풀 수 있는 방법은 바로 생각났지만 너무 직관적인 풀이법으로 돌아왔다.

조금 더 가독성과 시간복잡도를 고려해서 풀어봐야겠다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글