코딩 공부/코딩테스트

자바스크립트 코딩테스트 입문 (15)

천서리 2023. 5. 30. 21:19
QUOTE THE DAY

“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 15 문자열, 해시, 배열, 수학

출처 : https://programmers.co.kr/

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


영어가 싫어요

문제

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.

 

 

제한사항

  • numbers는 소문자로만 구성되어 있습니다.
  • numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" 들이 공백 없이 조합되어 있습니다.
  • 1 ≤ numbers의 길이 ≤ 50
  • "zero"는 numbers의 맨 앞에 올 수 없습니다.

 

입출력 예

numbers result
"onetwothreefourfivesixseveneightnine" 123456789
"onefourzerosixseven" 14067

 

입출력 예 설명

 

입출력 예 #1

  • "onetwothreefourfivesixseveneightnine"를 숫자로 바꾼 123456789를 return합니다.

입출력 예 #2

  • "onefourzerosixseven"를 숫자로 바꾼 14067를 return합니다.

 

solution.js

function solution(numbers) {
  const numDict = {
    zero: 0,
    one: 1,
    two: 2,
    three: 3,
    four: 4,
    five: 5,
    six: 6,
    seven: 7,
    eight: 8,
    nine: 9
  };

  let answer = "";
  let currentNumber = "";

  for (let i = 0; i < numbers.length; i++) {
    currentNumber += numbers[i];

    if (numDict.hasOwnProperty(currentNumber)) {
      answer += numDict[currentNumber];
      currentNumber = "";
    }
  }

  return parseInt(answer);
}
  1. numDict라는 객체를 선언하고, 각 영단어 숫자에 대응하는 숫자 값을 저장합니다.
  2. answer라는 빈 문자열을 선언합니다. 이 변수는 최종적으로 반환될 숫자를 저장합니다.
  3. currentNumber라는 빈 문자열을 선언합니다. 이 변수는 현재 처리 중인 문자열을 저장합니다.
  4. 주어진 문자열 배열을 반복하면서 각 문자열을 currentNumber에 추가합니다.
  5. currentNumber를 numDict 객체의 속성으로 확인합니다. 만약 currentNumber가 영단어 숫자에 해당한다면, numDict[currentNumber]를 answer에 추가합니다. 그리고 currentNumber를 빈 문자열로 초기화합니다.
  6. 반복이 끝나면, answer를 정수로 변환하여 반환합니다.

이 함수를 사용하면 문자열로 표현된 숫자를 실제 숫자로 변환할 수 있습니다. 예를 들어, solution(["one", "two", "three"])를 호출하면 123이 반환됩니다.


인덱스 바꾸기

문제

문자열 my_string과 정수 num1num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 1 < my_string의 길이 < 100
  • 0 ≤ num1, num2 < my_string의 길이
  • my_string은 소문자로 이루어져 있습니다.
  • num1  num2

 

입출력 예

my_string num1 num2 result
"hello" 1 2 "hlelo"
"I love you" 3 6 "I l veoyou"

 

입출력 예 설명

 

입출력 예 #1

  • "hello"의 1번째 인덱스인 "e"와 2번째 인덱스인 "l"을 바꾸면 "hlelo"입니다.

입출력 예 #2

  • "I love you"의 3번째 인덱스 "o"와 " "(공백)을 바꾸면 "I l veoyou"입니다.

 

solution.js

function solution(my_string, num1, num2) {
  const stringArr = Array.from(my_string);
  [stringArr[num1], stringArr[num2]] = [stringArr[num2], stringArr[num1]];
  return stringArr.join('');
}
  1. my_string을 Array.from() 메서드를 사용하여 문자열을 배열로 변환합니다. 이렇게 하면 각 문자가 배열의 요소로 들어갑니다.
  2. 배열 stringArr에서 num1과 num2에 해당하는 인덱스의 값을 교환하기 위해 배열 비구조화 할당을 사용합니다. 배열 비구조화 할당은 ES6에서 도입된 문법으로, 배열의 요소를 간편하게 교환하거나 변수에 할당하는 데 사용됩니다.
  3. stringArr 배열을 join('') 메서드를 사용하여 다시 문자열로 변환합니다. join() 메서드는 배열의 모든 요소를 하나의 문자열로 결합하는 역할을 합니다. 여기서는 빈 문자열 ''을 구분자로 사용하여 요소들을 이어붙입니다.
  4. 최종적으로 변환된 문자열을 반환합니다.

이 함수를 사용하면 주어진 문자열에서 두 개의 문자를 서로 교환할 수 있습니다. 예를 들어, solution("hello", 1, 3)를 호출하면 "hlelo"가 반환됩니다. "hello"에서 인덱스 1의 문자 'e'와 인덱스 3의 문자 'l'가 서로 교환되어 "hlelo"가 됩니다.


한 번만 등장한 문자

문제

문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.

 

 

제한사항

  • 0 < s의 길이 < 1,000
  • s는 소문자로만 이루어져 있습니다.

 

입출력 예

s result
"abcabcadc" "d"
"abdc" "abcd"
"hello" "eho"

 

입출력 예 설명

 

입출력 예 #1

  • "abcabcadc"에서 하나만 등장하는 문자는 "d"입니다.

입출력 예 #2

  • "abdc"에서 모든 문자가 한 번씩 등장하므로 사전 순으로 정렬한 "abcd"를 return 합니다.

입출력 예 #3

  • "hello"에서 한 번씩 등장한 문자는 "heo"이고 이를 사전 순으로 정렬한 "eho"를 return 합니다.

 

solution.js

function solution(s) {
  const charCount = new Map();

  for (let i = 0; i < s.length; i++) {
    const char = s[i];
    if (charCount.has(char)) {
      charCount.set(char, charCount.get(char) + 1);
    } else {
      charCount.set(char, 1);
    }
  }

  let answer = "";

  for (const [char, count] of charCount) {
    if (count === 1) {
      answer += char;
    }
  }

  return answer.split("").sort().join("");
}
  1. 빈 Map인 charCount를 생성합니다. Map은 키와 값의 쌍을 저장하는 자료구조입니다.
  2. 주어진 문자열 s를 순회하면서 각 문자의 등장 횟수를 세기 위해 for 루프를 사용합니다.
  3. 루프에서 현재 문자 char을 가져옵니다.
  4. charCount에 char가 이미 존재하는지 확인합니다. 존재한다면 해당 문자의 등장 횟수를 1 증가시킵니다. 존재하지 않는다면 charCount에 char를 키로 하여 1을 설정합니다.
  5. answer라는 빈 문자열을 생성합니다. 이 변수는 최종 결과를 저장합니다.
  6. charCount의 모든 항목을 순회하면서 등장 횟수가 1인 문자들을 찾습니다.
  7. for...of 루프에서 [char, count] 형태로 항목을 가져옵니다. 이때 char은 문자를, count는 해당 문자의 등장 횟수를 나타냅니다.
  8. count가 1인 경우에만 해당 문자 char를 answer에 추가합니다.
  9. answer를 배열로 변환한 후 sort() 메서드를 사용하여 사전 순으로 정렬합니다.
  10. 정렬된 배열을 다시 문자열로 변환하여 반환합니다.

이 함수를 사용하면 문자열에서 등장 횟수가 1인 문자들을 찾아서 사전 순으로 정렬한 결과를 얻을 수 있습니다. 예를 들어, solution("abacabad")를 호출하면 "bd"가 반환됩니다. 문자열 "abacabad"에서 등장 횟수가 1인 문자는 'b'와 'd'이며, 사전 순으로 정렬하면 "bd"가 됩니다.


약수 구하기

문제

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 1 ≤ n ≤ 10,000

 

입출력 예

n result
24 [1, 2, 3, 4, 6, 8, 12, 24]
29 [1, 29]

 

입출력 예 설명

 

입출력 예 #1

  • 24의 약수를 오름차순으로 담은 배열 [1, 2, 3, 4, 6, 8, 12, 24]를 return합니다.

입출력 예 #2

  • 29의 약수를 오름차순으로 담은 배열 [1, 29]를 return합니다.

 

solution.js

function solution(n) {
  const answer = [];

  for (let i = 1; i <= n; i++) {
    if (n % i === 0) {
      answer.push(i);
    }
  }

  return answer;
}
  1. 빈 배열 answer를 선언합니다. 이 배열은 최종 결과인 약수들을 저장할 것입니다.
  2. for 루프를 사용하여 1부터 n까지의 숫자를 반복합니다.
  3. 루프 내에서 현재 숫자 i가 n의 약수인지 확인합니다. 약수는 n을 i로 나눴을 때 나머지가 0인 수를 의미합니다. n % i === 0 조건을 사용하여 나머지가 0인지 확인합니다.
  4. 만약 n % i === 0 조건을 만족한다면, i는 n의 약수이므로 answer 배열에 추가합니다. answer.push(i)를 사용하여 i를 배열에 추가합니다.
  5. for 루프가 종료되면, answer 배열에는 n의 모든 약수가 저장되어 있습니다.
  6. answer 배열을 반환합니다.

이 함수를 사용하면 주어진 숫자의 약수를 찾아서 배열로 반환할 수 있습니다. 예를 들어, solution(12)를 호출하면 [1, 2, 3, 4, 6, 12]가 반환됩니다. 숫자 12의 약수는 1, 2, 3, 4, 6, 12입니다.

반응형
Adventure Time - BMO