본문 바로가기
codingtest

[programmers] 유한소수 판별하기, 최댓값 만들기 (2), 배열 자르기, 외계행성의 나이, 짝수의 합

by 안자두 2023. 3. 17.

📝 [Lv0] 유한소수 판별하기

👀 문제 설명

소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.

  • 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.

두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • a, b는 정수
  • 0 < a ≤ 1,000
  • 0 < b ≤ 1,000

 

💻 입출력 예

a b result
7 20 1
11 22 1
12 21 2

 

✨ 풀이 설명

유클리드 호제법을 이용해 최대공약수를 구해주었다. 호제법은 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 말한다. 2개의 자연수 a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면, a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 자세한 것은 링크를 들어가서 보는 것을 추천한다. 

아무튼, 이렇게 최대공약수를 구해준 다음, b를 최대공약수로 나눈 수가 2와 5로 나누어 떨어지는지 확인했다.

 

🕵️‍♂️ 코드

function solution(a, b) {
  const GCD = (num1, num2) => (num2 > 0 ? GCD(num2, num1 % num2) : num1);
  b /= GCD(a, b);

  while (b !== 1) {
    if (Number.isInteger(b / 2)) b /= 2;
    else if (Number.isInteger(b / 5)) b /= 5;
    else return 2;
  }
  return 1;
}

 


📝 [Lv0] 최댓값 만들기 (2)

👀 문제 설명

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • -10,000 ≤ numbers의 원소 ≤ 10,000
  • 2 ≤ numbers 의 길이 ≤ 100

 

💻 입출력 예

numbers result
[1, 2, -3, 4, -5] 15
[0, -31, 24, 10, 1, 9] 240
[10, 20, 30, 5, 5, 20, 5] 600

 

✨ 풀이 설명

최댓값 구하기 (1)과 비슷한 문제이다. 다른 점은, 이번 문제는 음수가 존재할 수도 있다는 점이다. 음수들의 곱은 양수가 되기 때문에 이를 고려하여 가장 작은 수들의 곱과 가장 근 수들의 곱을 비교해 주었다.

우선, 비교를 위해 정렬을 한 다음, 맨 앞의 두 수와, 맨 뒤의 두 수를 곱해주었다. 곱한 두 수 중 더 큰 수가 배열의 원소 중 두 수를 곱했을 때 나올 수 있는 가장 큰 수이다.

 

🕵️‍♂️ 코드

function solution(numbers) {
  numbers.sort((prev, next) => prev - next);
  return Math.max(numbers[0] * numbers[1], numbers[numbers.length - 1] * numbers[numbers.length - 2]);
}

 


📝 [Lv0] 배열 자르기

👀 문제 설명

정수 배열 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]

 

✨ 풀이 설명

slice()를 사용해 주었다. slice(a, b)는 a부터 b의 전까지 자른 새로운 배열을 반환해 준다. 이 문제에서는 num2까지 나와야 하기 때문에 num2에서 1을 더한 수를 두 번째 매개변수로 넣어주었다.

 

🕵️‍♂️ 코드

function solution(numbers, num1, num2) {
  return numbers.slice(num1, num2 + 1);
}

 


📝 [Lv0] 외계행성의 나이

👀 문제 설명

우주여행을 하던 머쓱이는 엔진 고장으로 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"

 

✨ 풀이 설명

숫자로 주어진 age를 빈 문자를 더해 문자열로 타입을 변환해 주었다. 그 후, 배열로 변환한 다음, map()을 사용해 각 숫자를 String.fromCharCode()로 문자로 변환해 주었다. 아스키코드를 사용하면 쉽게 변환할 수 있다. 

 

🕵️‍♂️ 코드

function solution(age) {
  return [...age + ''].map(num => String.fromCharCode(+num + 97)).join('');
}

 


📝 [Lv0] 짝수의 합

👀 문제 설명

정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.

 

🚨 제한 사항

0 < n ≤ 1000

 

💻 입출력 예

n result
10 30
4 6

 

✨ 풀이 설명

두 가지 방법으로 풀었다. 우선 수열 공식을 이용해 푸는 방법과, 반복문을 통해 짝수를 더하는 방법이다.

수열의 짝수 구하는 공식을 사용해 푸는 방법은 아래와 같이 Math.floor()로 내림을 해주었고, 반복문을 통해 푸는 방법은 index가 n일 때까지, 즉, n + 1 개수의 배열을 만들고, 각 배열의 인덱스 중, 짝수만을 더해 반환해 주었다.

 

🕵️‍♂️ 코드

function solution(n) {
  return Math.floor(n / 2) * (Math.floor(n / 2) + 1);
}
 
function solution(n) {
  return Array(n + 1).fill().reduce((sum, _, idx) => (idx % 2) ? sum : sum + idx, 0);
}

 

728x90