🐭 이번 주는 뭐 했어?
알고리즘 마지막 주차는 기본적인 이진 탐색과 DP에 관련해 공부 했었지만 자바스크립트의 기본적인 내장함수에 대한 복습하는 시간을 가질 겸 프로그래머스 1, 2레벨에 있는 문제를 전체적으로 풀어보는 시간을 가졌었다 이번 포스팅에서는 내장함수를 이용해 자료구조 관련된 문제 중 괜찮았던 문제들을 공유하도록 하겠습니다
정수 배열에 담긴 숫자들 중 두 개를 뽑아서 더해서 나오는 숫자들을 오름차순으로 출력하는 문제였습니다 더해서 나오는 숫자가 결과 배열에 들어가 있는지 확인하기 위한 indexOf()
와 그 조건에 맞으면 결과 배열에 push()
하고 마지막으로 오름차순으로 출력하기 위해 sort()
내장함수를 사용했습니다
function solution(numbers) {
const answer = [];
for(let i=0; i<numbers.length -1; i++) {
for(let j=i+1; j<numbers.length; j++) {
const sum = numbers[i] + numbers[j];
if(answer.indexOf(sum) == -1) {
answer.push(sum);
}
}
}
answer.sort((a,b) => a-b);
return answer;
}
string 값에서 가운데 글자를 출력하는 문제였습니다 단어의 길이가 짝수라면 가운데 두 글자를 반환해야 했기 때문에 floor
로 소수점을 제거한 가운데 길이를 구하고 slice()
내장함수를 사용해 가운데를 출력하는 문제였습니다
function solution(n) {
let al = n.length;
let num = Math.floor(al / 2);
if (al % 2 === 1) {
return n.slice(num, num + 1);
} else {
return n.slice(num - 1, num + 1);
}
}
이 문제는 내장함수만으로 문제를 풀 수 있어서 한번 가져와 봤습니다 split()
으로 문자열을 나누고 sort().reverse()
로 내림차순다시 join()
을 사용해 문자열로 만들었습니다
function solution(s) {
return s
.split('')
.sort()
.reverse()
.join('');
}
일반적인 소수 찾는 알고리즘을 사용하면 시간초과가 나오는 문제였기 때문에 구글링해본 결과 에라토스테네스의 체라고 2부터 시작해 본인을 제외한 배수를 제거하고 이미 제거된 숫자의 배수는 계산하지 않아도 그 숫자는 소수가 아니라는 것을 증명한 소수 찾기 알고리즘입니다 모든 숫자를 계속해서 검사하지 않아 시간을 절약할 수 있었습니다
function solution(n) {
let arr = Array(n + 1)
.fill()
.map((_, i) => i);
for (let i = 2; i <= n; i++) {
if (arr[i] === 0) continue;
for (let j = i * 2; j <= n; j += i) {
arr[j] = 0;
}
}
return arr.filter((v) => v !== 0).length - 1;
}
입력한 값이 제곱근이라면 2 제곱한 값의 +1의 제곱 값을 구하는 문제였습니다 Math 함수 중에 sqrt()
을 사용해 루트 값을 구하고 해당 값이 정수를 출력하는 루트 값이 맞다면 pow()
를 사용해 +1한 제곱 값을 구합니다
function solution(n) {
let result = Math.sqrt(n);
return Math.floor(result) === result ? Math.pow(result + 1, 2) : -1;
}
하샤드 수는 해당하는 양의 정수가 나누어진 양의 정수의 더한 값으로 나누어져야 합니다
우선 문자열로 만들어 자릿수를 나누고 parseInt()
로 다시 숫자로 만들고 reduce()
내장 함수를 사용해 자릿수를 더하고 입력된 양의 정수에 나눴을 때 나머지 유무를 리턴해줬습니다
function solution(x) {
let test = x
.toString()
.split("")
.map((num) => parseInt(num));
let r = test.reduce((a, b) => a + b);
let s = x % r === 0 ? true : false;
return s;
}
해당 괄호가 '('과 ')'로 하나의 괄호로 만들어져야 하는 게 문제였습니다 우선은 괄호가 하나로 완성되려면 짝수로 구성돼야 했고 처음 괄호가 ')' 인지 마지막 괄호가 '(' 인지 등을 검사해 올바른 괄호에 대한 유무를 리턴해줬습니다
const solution = (n) => {
let r = n.split("");
let sum = 0;
if (r[0] === ")" || r[0] === r[r.length-1] || r[r.length -1] === "(") {
return false
}
for (let i in r) {
if (r[i] === "(") {
sum += 1;
} else if (r[i] === ")") {
sum -= 1;
}
if (sum < 0) {
return false
}
}
if (sum > 0) {
return false;
} else if (sum === 0) {
return true;
}
};
문자열에서 최댓값과 최솟값을 찾아 문자열로 다시 출력하는 문제였습니다 우선 숫자 마다 공백으로 구분했기 때문에 배열로 만들어 min.apply()
와 max.apply()
를 사용해 최댓값과 최솟값을 구했습니다 여기서 apply()
는 배열 값에서 최소 최대를 구할 수 있었기 때문에 사용했습니다
function solution(s) {
let num = s.split(" ");
return (
String(Math.min.apply(null, num)) + " " + String(Math.max.apply(null, num))
);
}
입력된 값을 확인해 공백을 구분해 각 앞자리는 대문자로 출력하는 문제였습니다 우선 공백으로 단어가 나누어져 있기 때문에 각 단어끼리 배열로 만들고 해당 문자를 다시 분리해 0번째 index는 toUpperCase()
로 대문자로 나머지는 toLowerCase()
로 소문자로 만들고 다시 단어를 합쳤습니다 마지막으로 각 값의 마지막은 공백으로 만들어야 했는데 마지막 단어에서는 공백이 필요 없기 때문에 조건부를 만들어 마지막은 공백을 만들지 않도록 문제를 풀었습니다
function solution(s) {
let n = s.split(" ");
let arr = [];
console.log(n);
n.map((data, index) => {
for (let i = 0; i < data.length; i++) {
if (i === 0) {
arr.push(data[i].toUpperCase());
} else {
arr.push(data[i].toLowerCase());
}
}
if (index !== n.length - 1) {
arr.push(" ");
}
});
return arr.join("");
}
입력된 배열에 들어간 숫자로 가장 큰 숫자를 만드는 문제였습니다 앞자리와 뒷자리를 더했을 때 더 큰 숫자가 맞는지 확인하기 위해 숫자를 문자로 먼저 만들고 sort()
함수에서 서로 더한 값 중에 더 큰 순서대로 정렬시켜서 마지막으로 나온 값은 join()
으로 합쳤습니다 여기서 만약에 배열에 [0,0,0]
이런 식이었다면 결괏값이 "000"
이 나오기 때문에 이런 경우는무조건 0이기 때문에 조건부를 만들어줬습니다**
function solution(n) {
let a = n
.map((v) => v + "")
.sort((a, b) => (b + a) - (a + b))
.join("");
return a[0] === "0" ? "0" : a;
}
기존에 존재하는 1~10을 표현을 124 나라에서는 1,2,4로만 숫자를 표현했기 때문에 10진법의 숫자가 들어갔을 때 나오는 124 나라의 숫자를 구하는 문제였습니다 1,2,4의 패턴이 존재했었는데
숫자 | 몫 | 나머지 |
1 | 0 | 1 |
2 | 0 | 2 |
3 | 1 | 0 |
4 | 1 | 1 |
5 | 1 | 2 |
6 | 2 | 0 |
나머지가 1,2,0 으로 그때의 124 숫자는 4,1,2가 마지막 자리인 것이라는 패턴을 확인할 수 있었습니다 그 공식을 활용해 3배 배수마다 자릿수를 올려주고 순서대로 4,1,2를 출력해주는 코드를 작성했습니다
function solution(n) {
let num = ["4", "1", "2"];
let answer = "";
while (n > 0) {
answer = num[n % 3] + answer;
n = Math.floor((n - 1) / 3);
}
return answer
}