[Level1] 9. 41 ~ 45
하루 세문제씩 꾸준히 풀기! 였으나 문제가 너무 쉬워서 5개를 풀어보겠다😂
41. 약수의 합
function solution(n) {
let temp = [];
for (let i = 1; i * i <= n; i++) {
if (n % i === 0) temp.push(i);
}
let arr = [];
for (let i = temp.length - 1; i >= 0; i--) {
arr.push(n / temp[i]);
}
return Array.from(new Set(temp.concat(arr))).reduce(
(prev, value) => prev + value,
0
);
}
사실 엄청 간단하게 for 하나로만 풀 수 있지만, 시간복잡도를 최대한 줄여보고자 다음과 같이 짯다!
중복되는 거 없애려고 set으로 변환했다 다시 array로 바꾸는 불필요한 동작이 있지만, n이 크다면 이 해답이 훨씬 효율적일 것 같다!
best 풀이
function solution(n, a=0, b=0) {
return n<=a/2?b:solution(n,a+1,b+=n%a?0:a);
}
재귀함수를 이용해서도 풀었다….
나도 재귀에 능숙해지고싶다…😭
set to array
Array.from(set)
[...set]
42. 소수 찾기😭
function solution(n) {
let arr = new Array(n + 1).fill(1);
arr[0] = 0; //1은 소수에서 제외
arr[1] = 0;
for (let i = 2; i ** 2 <= n; i++) {
for (let j = i * 2; j <= n; j += i) {
arr[j] = 0;
}
}
return arr.filter((item) => item === 1).length;
}
에라토스테네스의 체 알고리즘
각 수의 배수에 해당하는 수는 소수가 아니다.
43. 문자열 다루기 기본
function solution(s) {
let length = s.length;
if (length === 4 || length === 6) {
return s.split("").every((item) => !isNaN(item));
}
return false;
}
- 숫자인지 아닌지 :
Number.isNaN()
- 모든 요소 :
every()
best 풀이
function alpha_string46(s){
let regex = /^\d{6}$|^\d{4}$/;
return regex.test(s);
}
정…규…식
내일 무조건 정규식 관련 포스팅 올리기!
44. 시저 암호😭
방법1
function solution(s, n) {
return s
.split("")
.map((item) => {
if (item === " ") return item;
const temp = item.charCodeAt();
return item.toUpperCase().charCodeAt() + n > 90 //Z
? String.fromCharCode(temp + n - 26)
: String.fromCharCode(temp + n);
})
.join("");
}
- string to ascii :
s.charCodeAt()
- ascii to string :
String.fromCharCode(number)
왜 upper한뒤에 90보다 커지는가를 이해하기위해 한참을 생각했다!
z보다 커지면 다시 a 로 가야하기 때문에 -26 을 해준다
방법2 - 아스키코드 사용 X
function solution(s, n) {
let upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
let lower = "abcdefghijklmnopqrstuvwxyz";
let answer= '';
for(let i =0; i <s.length; i++){
let text = s[i];
if(text == ' ') {
answer += ' ';
continue;
}
let textArr = upper.includes(text) ? upper : lower;
let index = textArr.indexOf(text)+n;
if(index >= textArr.length) index -= textArr.length;
answer += textArr[index];
}
return answer;
}
45. 이상한 문자 만들기
function solution(s) {
let arr = s.split(" ");
let answer = "";
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j++) {
answer +=
j === 0 || j % 2 === 0
? arr[i][j].toUpperCase()
: arr[i][j].toLowerCase();
}
answer += " ";
}
return answer.substr(0, answer.length-1)
}
마지막 문자열의 “ “(빈공백)을 어떻게 없애야 하나 고민이 많았다.
substr을 이용해서 처음부터 내가 원하는 곳까지를 구해서 return하기!
문자열 자르는 방법 익혀놓자!
- substr(시작인덱스, 갯수)
- slice(시작인덱스, 갯수)
- substring(시작인덱스, 종료인덱스-1)
- 둘다 기존의 문자열엔 영향을 안미치고 새 문자열 반환
- mdn 을 보니 substr 은 도태된것 같다! slice 사용하기
best 풀이
function toWeirdCase(s){
return s.toUpperCase().replace(/(\w)(\w)/g, function(a){return a[0].toUpperCase()+a[1].toLowerCase();})
}