[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. 소수 찾기😭

programmers

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. 문자열 다루기 기본

programmers

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. 시저 암호😭

programmers

방법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. 이상한 문자 만들기

programmers

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();})
}