코딩 공부/코딩테스트

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

천서리 2023. 5. 29. 16:18
QUOTE THE DAY

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

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 14 조건문, 반복문, 시뮬레이션, 문자

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

 

프로그래머스

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

programmers.co.kr


가까운 수

문제

숫자와 "Z"가 공백으로 구분되어 담긴 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 "Z"가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 "Z"로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 1 ≤ array의 길이 ≤ 100
  • 1 ≤ array의 원소 ≤ 100
  • 1 ≤ n ≤ 100
  • 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

 

입출력 예

array n result
[3, 10, 28] 20 28
[10, 11, 12] 12 12

 

입출력 예 설명

 

입출력 예 #1

  • 3, 10, 28 중 20과 가장 가까운 수는 28입니다.

입출력 예 #2

  • 10, 11, 12 중 13과 가장 가까운 수는 12입니다.

 

solution.js

function solution(array, n) {
  array.sort(function(a, b) {
    return a - b;
  });

  var left = 0;
  var right = array.length - 1;
  var closest = array[left];

  while (left <= right) {
    var mid = Math.floor((left + right) / 2);
    var current = array[mid];

    if (current === n) {
      return current;
    }

    if (Math.abs(n - current) < Math.abs(n - closest)) {
      closest = current;
    }

    if (current < n) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }

  return closest;
}
  1. 주어진 배열 array를 오름차순으로 정렬합니다. 정렬된 배열을 이용하여 이진 탐색을 수행합니다.
  2. 함수의 인자로 주어진 숫자 n과 가장 가까운 값을 찾기 위해 이진 탐색을 사용합니다. 이진 탐색은 주어진 배열의 중간 원소와 n을 비교하여 탐색 범위를 좁혀가는 방식으로 동작합니다.
  3. 탐색 범위는 leftright라는 변수로 관리됩니다. 초기에 left는 배열의 첫 번째 인덱스(0)를 가리키고, right는 배열의 마지막 인덱스를 가리킵니다. 이진 탐색은 leftright가 교차할 때까지 반복됩니다.
  4. 반복문 안에서는 현재 탐색 범위의 중간 인덱스 mid를 계산하고, 중간 원소 current를 가져옵니다.
  5. 중간 원소 currentn을 비교하여 일치하는 경우, current을 반환합니다. 즉, n과 같은 수가 배열에 존재하면 해당 값을 반환하고 종료합니다.
  6. 일치하지 않는 경우에는 가장 가까운 값을 찾기 위해 Math.abs(n - current)Math.abs(n - closest)를 비교합니다. Math.abs() 함수는 절댓값을 반환하는 함수입니다. 따라서, 현재 원소 current와 가장 가까운 값을 업데이트하기 위해 이전에 저장한 closest와 비교하여 더 가까운 값을 찾습니다.
  7. currentn보다 작은 경우, 탐색 범위를 오른쪽으로 좁힙니다. 이는 mid를 기준으로 탐색 범위의 왼쪽 부분은 무시하고 오른쪽 부분만 남기는 것을 의미합니다. 그렇지 않은 경우에는 탐색 범위를 왼쪽으로 좁힙니다.

이렇게 탐색 범위를 좁혀가며 반복하면 leftright가 교차하게 되고 반복문이 종료됩니다. 반복문이 종료되면 closest 변수에는 가장 가까운 값이 저장되어 있습니다. 이 값을 반환하여 함수의 실행이 종료됩니다.


369게임

문제

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 1 ≤ order ≤ 1,000,000

 

입출력 예

order result
3 1
29423 2

 

입출력 예 설명

 

입출력 예 #1

  • 3은 3이 1개 있으므로 1을 출력합니다.

입출력 예 #2

  • 29423은 3이 1개, 9가 1개 있으므로 2를 출력합니다.

 

solution.js

function solution(order) {
  var answer = 0;

  var count = 0;

  var str = order.toString();
  for (var i = 0; i < str.length; i++) {
    var digit = parseInt(str[i]);

    if (digit === 3 || digit === 6 || digit === 9) {
      count++;
    }
  }

  answer = count;

  return answer;
}
  1. answer 변수를 0으로 초기화합니다. 이 변수는 박수를 총 몇 번 쳐야하는지를 나타내는 값입니다.
  2. count 변수를 0으로 초기화합니다. 이 변수는 3, 6, 9의 개수를 세기 위한 변수로 사용됩니다.
  3. 주어진 숫자 order를 문자열로 변환한 후 str 변수에 저장합니다. 이렇게 함으로써 입력된 숫자를 한 자리씩 확인할 수 있습니다.
  4. for 반복문을 사용하여 문자열 str의 각 자리 숫자를 확인합니다. 반복문의 변수 i는 현재 자리의 인덱스를 나타냅니다.
  5. str[i]parseInt() 함수를 사용하여 정수로 변환한 후 digit 변수에 저장합니다. 이렇게 함으로써 현재 자리의 숫자를 얻을 수 있습니다.
  6. if 문을 사용하여 digit이 3, 6, 9 중 하나인지 확인합니다. 만약 그렇다면 count를 증가시킵니다. 이는 3, 6, 9가 등장한 횟수를 세는 과정입니다.
  7. 모든 자리의 숫자를 확인한 후, count 값을 answer에 대입합니다. count 변수에는 3, 6, 9가 등장한 횟수가 저장되어 있으므로, answer에도 같은 값을 저장합니다.
  8. 마지막으로, answer 값을 반환하여 함수의 실행이 종료됩니다.

암호 해독

문제

군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.

  • 암호화된 문자열 cipher를 주고받습니다.
  • 그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.

문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 1 ≤ cipher의 길이 ≤ 1,000
  • 1 ≤ code  cipher의 길이
  • cipher는 소문자와 공백으로만 구성되어 있습니다.
  • 공백도 하나의 문자로 취급합니다.

 

입출력 예

cipher code result
"dfjardstddetckdaccccdegk" 4 "attack"
"pfqallllabwaoclk" 2 "fallback"

 

입출력 예 설명

 

입출력 예 #1

  • "dfjardstddetckdaccccdegk" 의 4번째, 8번째, 12번째, 16번째, 20번째, 24번째 글자를 합친 "attack"을 return합니다.

입출력 예 #2

  • "pfqallllabwaoclk" 의 2번째, 4번째, 6번째, 8번째, 10번째, 12번째, 14번째, 16번째 글자를 합친 "fallback"을 return합니다.

 

solution.js

function solution(cipher, code) {
  var answer = '';

  for (var i = code - 1; i < cipher.length; i += code) {
    answer += cipher[i];
  }

  return answer;
}
  1. answer 변수를 빈 문자열로 초기화합니다. 이 변수는 추출된 암호 문자를 저장하기 위한 변수입니다.
  2. for 반복문을 사용하여 코드 간격에 해당하는 암호 문자를 추출합니다. 반복문의 변수 icode - 1로 초기화됩니다. 이는 추출할 첫 번째 암호 문자의 인덱스를 나타냅니다.
  3. 반복문의 조건은 icipher.length보다 작을 때까지입니다. 이는 추출할 인덱스가 암호문의 범위를 넘어서지 않도록 하는 조건입니다.
  4. 반복문이 실행될 때마다 icode만큼 증가시킵니다. 이는 주어진 코드 간격에 해당하는 암호 문자를 추출하기 위한 역할을 합니다.
  5. 반복문 안에서는 cipher[i]answer에 추가합니다. 이는 추출한 암호 문자를 answer 문자열에 덧붙이는 과정입니다.
  6. 모든 추출이 완료되면, answer를 반환하여 함수의 실행이 종료됩니다.

이 함수는 암호문과 코드를 활용하여 일정한 간격으로 암호 문자를 추출하는 기능을 구현한 것입니다. 예를 들어, 암호문이 "abcdefg"이고 코드가 3인 경우, "a"부터 시작하여 3칸씩 이동하여 "adg"를 추출합니다.


대문자와 소문자

문제

문자열 my_string이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string은 영어 대문자와 소문자로만 구성되어 있습니다.

 

입출력 예

my_striong result
"cccCCC" "CCCccc"
"abCdEfghIJ" "ABcDeFGHij"

 

입출력 예 설명

 

입출력 예 #1

  • 소문자는 대문자로 대문자는 소문자로 바꾼 "CCCccc"를 return합니다.

입출력 예 #2

  • 소문자는 대문자로 대문자는 소문자로 바꾼 "ABcDeFGHij"를 return합니다.

 

solution.js

function solution(my_string) {
  var answer = '';

  for (var i = 0; i < my_string.length; i++) {
    var char = my_string[i];

    if (char >= 'a' && char <= 'z') {
      answer += char.toUpperCase();
    } else if (char >= 'A' && char <= 'Z') {
      answer += char.toLowerCase();
    } else {
      answer += char;
    }
  }

  return answer;
}
  1. answer 변수를 빈 문자열로 초기화합니다. 이 변수는 변환된 문자열을 저장하기 위한 변수입니다.
  2. for 반복문을 사용하여 문자열 my_string의 각 문자를 순회합니다. 반복문의 변수 i는 현재 문자의 인덱스를 나타냅니다.
  3. 반복문 안에서는 my_string[i]char 변수에 저장합니다. 이렇게 함으로써 현재 문자를 확인할 수 있습니다.
  4. if 문을 사용하여 현재 문자 char가 소문자인지, 대문자인지, 또는 알파벳이 아닌지를 확인합니다.
  5. 만약 char가 소문자인 경우, toUpperCase() 함수를 사용하여 대문자로 변환한 후, answer에 추가합니다.
  6. 만약 char가 대문자인 경우, toLowerCase() 함수를 사용하여 소문자로 변환한 후, answer에 추가합니다
  7. char가 알파벳이 아닌 경우(숫자, 공백, 특수문자 등), 그대로 answer에 추가합니다.
  8. 반복문이 모든 문자를 순회한 후, 변환된 문자열 answer를 반환하여 함수의 실행이 종료됩니다.

이 함수는 문자열에서 소문자와 대문자를 상호 변환하는 기능을 구현한 것입니다. 예를 들어, "HelloWorld"라는 문자열이 주어진 경우, 소문자는 대문자로, 대문자는 소문자로 변환하여 "hELLOwORLD"를 반환합니다.

 

반응형
Adventure Time - BMO