상세 컨텐츠

본문 제목

[CodeKata.js] reduce 배열 합 / 숫자 분리시 문자열로 우선 변환 / 전개연산자(...) / 배열 거꾸로 / Math.pow & sqrt / sort 오름차순

codeKata

by 서울의볼 2024. 2. 11. 18:28

본문

짝수와 홀수

  • 짝수와 홀수를 구할 때 굳이 몫이 '0'인지 아닌지 구분할 필요 없음. 불리언을 활용하여 0은 자동으로 true 값이 되기 때문:
    function solution(num) {
        let result = (num % 2 === 0) ? "Even" : "Odd";
        return result;
    }​
    • 벤치마킹 하고자 하는 답안 (삼항 연산자를 쓴 건 동일함):
      function evenOrOdd(num) {
        return num % 2 ? "Odd" : "Even"
      }
      
      // 아래는 테스트로 출력해 보기 위한 코드입니다.
      console.log("결과 : " + evenOrOdd(2));
      console.log("결과 : " + evenOrOdd(3));​
  •  마지막 답안은 선언된 변수로만 return할 수 있도록 변수 할당을 자주자주 해줘야 함.

 

자릿수 더하기

  • 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
    예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. <-- 문제에서 고전한 부분은 숫자를 우선 문자열로 변환하여 각 자릿수를 분리했어야 함
    function solution(n)
    {
       const answer = String(n).split('').reduce((acc,val)=>acc+Number(val),0)
       return answer
    }​​

약수의 합

  • 약수 구하는 건 아래처럼 하면 됨,,, 뭔가 걍 도움될 거 같아서 넣어둠:
    function solution(n) {    
        let divisors = [];
    
        for (let i = 0; i <= n; i++) {
            if (n % i === 0) {
                divisors.push(i);
            }
        }
    
        let answer = divisors.reduce(function(acc, cur){
            return acc + cur;
        }, 0);
    
        return answer;
    }​
    더 간결하게 (모범 답안):
    function solution(num) {
        let sum = 0;
        for (let i = 1; i <= num; i++) {
            if (num % i === 0) sum += i
        }
        return sum
    }​

나머지가 1이 되는 수 中 최소값

  • 위를 응용하여 이 문제도 풀어봄: 자연수 n이 매개변수로 주어집니다. n x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.
    function solution(n) {
        let x = [];
    
        for (let i = 1; i <= n; i++) {
            if (n % i === 1) {
                x.push(i);
            }
        }
    
        return Math.min(...x);
    }​
     여기서 눈여겨 볼 점은 전개 연산자(...)를 사용하여 배열내 객체를 펼쳐 최소값을 찾는 것임.
    전개 연산자(Spread Operator)는 ES6의 문법으로 배열이나 문자열과 같이 반복 가능한 객체를 하나씩 펼쳐서 리턴한다고 함.
    모범답안:
    const solution = function(n) {
        for (let i=0; i<n; i++){
            if (n%i == 1){
                return i
            }
        }
    }​
     

자연수 뒤집어 배열로 만들기

  • 배열 거꾸로 쓰고 싶을 때 참고 // 그리고 데이터형 바꿀 때 Number 붙이는 위치도 같이 참고하셈!
    function solution(n) {
        let answer = [];
    
        let numbers = String(n).split('');
    
        for (let i = numbers.length - 1; i >= 0; i-- ) {
            answer.push(Number(numbers[i]));
        }
        return answer;
    }​
     참고로 문자열로 변환시킬 때 n + " "로도 가능함 (or toString()).
    parseInt는 문자열을 정수로 변환하는 내장 함수인데, 숫자가 아닌 문자를 만나면 변환을 멈춤.

문자열을 정수로 바꾸기 

  • int에서 string으로 바꿀 땐 ""+int // string에서 int로 바꿀 땐 +string
    function solution(s) {
        let answer = Number(s);
        return answer;
    }​
     으로 했는데,,, 사칙연산 되면서 문자가 자동으로 숫자로 파싱되게 만드는 방법도 있었음:
    function strToInt(str){
      return str/1
      }​

정수 제곱근 판별

  • 지수승을 구하는 함수는 Math.pow가 있음 --> Math.pow(x, y)하면 x의 y제곱을 계산하는 것
    function solution(n) {
       return Number.isInteger(Math.sqrt(n)) ? Math.pow(Math.sqrt(n) + 1,2) : -1
    }

정수 내림차순

  • 이 문제는 좀 킹받아서 내 답과 함께 적어둠:
    function solution(n) {
        let nums = Array.from(String(n), Number);
        nums.sort((a, b) => b - a);
        let answer = parseInt(nums.join(''));
        return answer;
    }​
     벤치마크 (보기 확실히 편함):
    function solution(n) {
        return parseInt((n+"").split("").sort().reverse().join(""));
    }​

 

 

 

 

 

 

 

 

관련글 더보기