코딩 공부/코딩테스트

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

천서리 2023. 5. 23. 21:37
QUOTE THE DAY

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

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 8 배열, 구현, 수학

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

 

프로그래머스

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

programmers.co.kr


배열 자르기

문제

정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 2 ≤ numbers의 길이 ≤ 30
  • 0 ≤ numbers의 원소 ≤ 1,000
  • 0 ≤num1 < num2 < numbers의 길이

 

입출력 예

 

numbers num1 num2 result
[1, 2, 3, 4, 5] 1 3 [2, 3, 4]
[1, 3, 5] 1 2 [3, 5]

입출력 예 설명

 

입출력 예 #1

  • [1, 2, 3, 4, 5]의 1번째 인덱스 2부터 3번째 인덱스 4 까지 자른 [2, 3, 4]를 return 합니다.

입출력 예 #2

  • [1, 3, 5]의 1번째 인덱스 3부터 2번째 인덱스 5까지 자른 [3, 5]를 return 합니다.

 

solution.js

function solution(numbers, num1, num2) {
  var answer = numbers.slice(num1, num2 + 1);
  return answer;
}
  1. answer라는 변수를 선언하고, numbers 배열의 num1부터 num2까지의 요소를 추출하여 저장합니다. 이 때, slice 메서드를 사용하여 배열의 일부분을 추출합니다. num1은 시작 인덱스이고, num2 + 1은 끝 인덱스로 설정되어야 합니다. 끝 인덱스는 포함되지 않으므로 num2 + 1이 사용됩니다.
  2. answer 배열을 반환합니다.

예를 들어, numbers 배열이 [1, 2, 3, 4, 5]이고, num1이 1이고, num2가 3이라면, 함수는 [2, 3, 4]를 반환합니다. 왜냐하면 numbers 배열에서 인덱스 1부터 인덱스 3까지의 요소를 추출하기 때문입니다.

 


외계행성의 나이

문제

우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • age는 자연수입니다.
  • age ≤ 1,000
  • PROGRAMMERS-962 행성은 알파벳 소문자만 사용합니다.

 

입출력 예

 

age result
23 "cd"
51 "fb"
100 "baa"

입출력 예 설명

 

입출력 예 #1

  • age가 23이므로 "cd"를 return합니다.

입출력 예 #2

  • age가 51이므로 "fb"를 return합니다.

입출력 예 #3

  • age가 100이므로 "baa"를 return합니다.

 

solution.js

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

  while (age > 0) {
    var remainder = age % 10; 
    var alpha = String.fromCharCode(97 + remainder); 
    answer = alpha + answer;
    age = Math.floor(age / 10);
  }

  return answer;
}
  1. answer라는 빈 문자열을 선언합니다. 이 변수는 결과 문자열을 저장할 용도로 사용됩니다.
  2. while 루프를 사용하여 age가 0보다 큰 동안 반복합니다.
  3. remainder라는 변수를 선언하고, age를 10으로 나눈 나머지를 저장합니다. remainder 변수는 age의 가장 오른쪽 자릿수를 나타냅니다.
  4. alpha라는 변수를 선언하고, remainder에 97을 더한 후, String.fromCharCode 메서드를 사용하여 해당 숫자에 해당하는 알파벳 문자열을 얻습니다. 이 때, 97은 소문자 'a'의 유니코드 값입니다.
  5. answer 변수에 alpha를 현재 결과 문자열의 가장 왼쪽에 추가합니다. 이렇게 함으로써 answer 문자열이 역순으로 구성됩니다.
  6. age를 10으로 나눈 몫을 구하여 age 변수에 다시 할당합니다. Math.floor 함수를 사용하여 정수 몫을 얻습니다.
  7. while 루프가 종료되면, answer 문자열이 완성되었습니다.
  8. answer 문자열을 반환합니다.

예를 들어, age 값이 123이라면, 함수는 'cba'를 반환합니다. 왜냐하면 age 값을 자릿수로 분리하고, 각 자릿수에 대응하는 알파벳 문자열을 생성하여 역순으로 이어붙였기 때문입니다.


진료순서 정하기

문제

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 중복된 원소는 없습니다.
  • 1 ≤ emergency의 길이 ≤ 10
  • 1 ≤ emergency의 원소 ≤ 100

 

입출력 예

 

emergency result
[3, 76, 24] [3, 1, 2]
[1, 2, 3, 4, 5, 6, 7] [7, 6, 5, 4, 3, 2, 1]
[30, 10, 23, 6, 100] [2, 4, 3, 5, 1]

입출력 예 설명

 

입출력 예 #1

  • emergency가 [3, 76, 24]이므로 응급도의 크기 순서대로 번호를 매긴 [3, 1, 2]를 return합니다.

입출력 예 #2

  • emergency가 [1, 2, 3, 4, 5, 6, 7]이므로 응급도의 크기 순서대로 번호를 매긴 [7, 6, 5, 4, 3, 2, 1]를 return합니다.

입출력 예 #3

  • emergency가 [30, 10, 23, 6, 100]이므로 응급도의 크기 순서대로 번호를 매긴 [2, 4, 3, 5, 1]를 return합니다.

 

solution.js

function solution(emergency) {
    let sorted = emergency.slice().sort((a,b)=>b-a);
    return emergency.map(v=>sorted.indexOf(v)+1);
}
  1. sorted라는 변수를 선언하고, emergency 배열의 복사본을 만든 후, sort 메서드를 사용하여 내림차순으로 정렬합니다. 이렇게 함으로써 sorted 배열은 원래 배열의 요소들이 큰 순서대로 정렬된 상태를 가지게 됩니다.
  2. emergency 배열의 각 요소에 대해 map 메서드를 사용하여 반복 작업을 수행합니다. map 메서드는 콜백 함수를 호출하며, 각 요소를 순회하면서 실행됩니다.
  3. 콜백 함수의 매개변수 v는 현재 순회 중인 요소를 나타냅니다.
  4. sorted 배열에서 v의 인덱스를 indexOf 메서드를 사용하여 찾고, 1을 더한 값을 반환합니다. 이렇게 함으로써 v가 원래 배열에서 몇 번째로 큰 요소인지를 나타내는 값이 map 메서드에 의해 생성되는 새로운 배열에 저장됩니다.
  5. map 메서드가 종료되면, 원래 배열의 요소들에 대한 순서 정보가 담긴 새로운 배열이 완성됩니다.
  6. 이 배열을 반환합니다.

예를 들어, emergency 배열이 [3, 5, 2, 4, 1]이라면, 함수는 [2, 1, 3, 2, 5]를 반환합니다. 왜냐하면 emergency 배열에서 각 요소가 원래 배열에서 몇 번째로 큰 요소인지를 나타내는 배열을 생성하기 때문입니다. 원래 배열에서 3은 두 번째로 크므로 2가 할당되고, 5는 가장 크므로 1이 할당되는 식입니다.


순서쌍의 개수

문제

순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • 1 ≤ n ≤ 1,000,000

 

입출력 예

 

n result
20 6
100 9

입출력 예 설명

 

입출력 예 #1

  • n이 20 이므로 곱이 20인 순서쌍은 (1, 20), (2, 10), (4, 5), (5, 4), (10, 2), (20, 1) 이므로 6을 return합니다.

입출력 예 #2

  • n이 100 이므로 곱이 100인 순서쌍은 (1, 100), (2, 50), (4, 25), (5, 20), (10, 10), (20, 5), (25, 4), (50, 2), (100, 1) 이므로 9를 return합니다.

 

solution.js

function solution(n) {
  let answer = 0;

  for (let i = 1; i <= Math.sqrt(n); i++) {
    if (n % i === 0) {
      if (i * i === n) {
        answer++;
      } else {
        answer += 2;
      }
    }
  }

  return answer;
}
  1. answer라는 변수를 선언하고, 초기값을 0으로 설정합니다. 이 변수는 약수의 개수를 저장할 용도로 사용됩니다.
  2. for 루프를 사용하여 i 변수를 1부터 n의 제곱근까지 1씩 증가시키면서 반복합니다. 이렇게 함으로써 i는 n의 약수 후보가 됩니다.
  3. if 문을 사용하여 n이 i로 나누어 떨어지는지 확인합니다. 즉, n이 i의 약수인지 확인합니다.
  4. n이 i로 나누어 떨어진다면, if 문 내부로 진입합니다.
  5. if 문 내부에서는 i가 n의 제곱근인지를 확인합니다. 이를 통해 중복 약수인 경우를 제외합니다. 만약 i가 n의 제곱근이라면, answer를 1 증가시킵니다.
  6. 그렇지 않은 경우, i와 n을 나눈 다른 약수를 찾은 것이므로, answer를 2 증가시킵니다. 예를 들어, n이 12이고, i가 3인 경우, 3과 12를 나누는 다른 약수인 4를 찾은 것입니다.
  7. for 루프가 종료되면, answer 변수에는 n의 약수의 개수가 저장됩니다.
  8. answer 값을 반환합니다.

예를 들어, n이 12라면, 함수는 6을 반환합니다. 왜냐하면 12의 약수는 1, 2, 3, 4, 6, 12로 총 6개이기 때문입니다.

반응형
Adventure Time - BMO