풀이가 너무 짧거나 간단한 문제 4가지를 그냥 합쳐서 포스팅.
배열 회전시키기
문제 설명
정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요
제한사항
- 3 ≤ numbers의 길이 ≤ 20
- direction은 "left" 와 "right" 둘 중 하나입니다.
풀이
right의 경우 Array에서 사용할 수 있는 unshift()와 at() 매서드를 사용한다.
at(index) 매서드는 배열에서 주어진 index의 원소를 표현해주는데, -1을 넣으면 마지막 원소를 구해준다.
unshift() 매서느는 배열의 맨 앞에 주어진 원소를 추가해준다.
즉 첫번째로 at(-1)을 이용해 배열에 맨 마지막 원소를 배열의 맨앞에 추가해준다.
[1,2,3] 이란 배열이 있을 경우 [3,1,2,3] 의 형태로 만들어준 뒤,
slice 매서드로 0부터, 배열의 길이에서 1을 뺀만큼 짤라준다.
left의 경우 push 매서드를 사용한다. push() 매서드의 경우 배열의 마지막에 주어진 원소를 추가해준다.
[1,2,3] 이란 배열일 경우, at(0)을 사용해 첫번째 원소를 마지막에 추가해준다
[1,2,3,1] 의 형태가 되었을때 slice 매서드를 사용해서 두번째 원소 부터 끝까지 잘라준다.
(slice 매서드에서 두번째 인자를 넣지않으면 끝까지 잘라짐)
const solution = (numbers, direction) => {
switch(direction){
case "right" :
numbers.unshift(numbers.at(-1));
numbers = numbers.slice(0, numbers.length - 1);
break;
case "left" :
numbers.push(numbers.at(0));
numbers = numbers.slice(1);
break;
default : break;
}
return numbers;
}
주사위의 개수
문제 설명
머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- box의 길이는 3입니다.
- box[0] = 상자의 가로 길이
- box[1] = 상자의 세로 길이
- box[2] = 상자의 높이 길이
- 1 ≤ box의 원소 ≤ 100
- 1 ≤ n ≤ 50
- n ≤ box의 원소
- 주사위는 상자와 평행하게 넣습니다.
풀이
박스의 가로,세로,높이가 배열로 주어지니 인자로 들어오는 box를 [w, d, h]로 분해하여 가져 온 뒤
소숫점을 버리는 쪽으로 n으로 각각 나눠준 뒤 셋다 곱해주면 된다.
Math.trunc() : 소숫점을 버림처리 해준다.
const solution = ([w, d, h], n) => Math.trunc(w/n) * Math.trunc(d/n) * Math.trunc(h/n)
합성수 찾기
문제 설명
약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 100
풀이
어떻게 풀어야할지 조금 고민했던 문제긴 한데 간단하게 풀었다.
물론 테스트케이스가 숫자가 많아질 경우 성능상 이슈가 있을것 같긴 한데..
합성수들의 갯수를 저장할 unions 변수를 만들고,
1부터 n까지 반복하는데, 이때 반복마다 약수의 갯수를 체크하기 위해
count 변수를 각 반복마다 초기화 해준다.
이후 i가 반복될때마다 1부터 i까지로 나눠서 나머지가 0인경우 (해당 숫자로 나누어 떨어지는경우)
count에 +1을 해준다. count가 2이상인경우 (1과 자기자신)는 약수가 3개 이상이라는 소리이므로
unions 에 1을 추가해주고, 해당 for문이 종료될 경우 unions를 리턴해준다.
const solution = (n) => {
let unions = 0;
for(let i = 1; i <= n; i ++){
let count = 0;
for(let j = 1; j <= i; j ++) i%j === 0 && count ++;
count > 2 && unions ++;
}
return unions;
}
팩토리얼
문제 설명
i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
- i! ≤ n
제한사항
- 0 < n ≤ 3,628,800
풀이
팩토리얼 재귀함수를 만들 수 있으면 쉽게 풀 수 있다.
const factorial = (n) => n === 1 ? n : n * factorial(n-1);
이런 형태고, n이 1이 될때까지 1씩 내려가면서 곱한다. 그냥 외우는 편이 나을수도.
이후 n보다 작거나 같아야 하므로 while문으로 조건을 걸어서돌려줬다.
const solution = (n) => {
const factorial = (n) => n === 1 ? n : n * factorial(n-1)
let count = 1;
while(true){
if(factorial(count) <= n) count ++;
else return count - 1;
}
}