알고리즘, 자료구조

[알고리즘] Leetcode. Find Numbers with Even Number of Digits

Alexim 2022. 5. 20. 22:03

Given an array nums of integers, return how many of them contain an even number of digits.

정수가 담겨있는 배열이 주어지고, 짝수 자릿수가 몇 개인지 리턴하세요.

 

Example 1:

Input: nums = [12,345,2,6,7896]
Output: 2
Explanation: 
12 contains 2 digits (even number of digits). 
345 contains 3 digits (odd number of digits). 
2 contains 1 digit (odd number of digits). 
6 contains 1 digit (odd number of digits). 
7896 contains 4 digits (even number of digits). 
Therefore only 12 and 7896 contain an even number of digits.

Example 2:

Input: nums = [555,901,482,1771]
Output: 1 
Explanation: 
Only 1771 contains an even number of digits.

방법 1. number를 string으로 바꾸고 length로 자릿수를 구하기

var findNumbers = function(nums) {
    let count = 0;
    let devideNumber;
    for (let i = 0; i < nums.length; i++) {
        if (!(nums[i].toString().length % 2)) {
            count++;
        }
    }
    
    return count;
};
Runtime: 109 ms
Memory Usage: 44 MB

 

속도와 메모리가 별로 좋은 것 같지않아 힌트를 확인하니 Divide the number by 10 again and again to get the number of digits. 10으로 계속 나눠서 자릿수를 확인하라는 게 있었다. 

 

5050 숫자의 자릿수를 구하기 위해 10으로 4번 나누게 되면 1보다 작거나 같은 숫자가 된다. 즉 나눈 횟수로 자릿수를 구할 수 있다.

10의 배수는 나머지가 없기 때문에 while문에서 1보다 크거나 같은지를 조건에 넣어주었다. 

 

방법 2. 10으로 나눠서 자릿수 구하기

var findNumbers = function(nums) {
    let count = 0;
    let devideNumber;
    let digitCount = 0;
    for (let i = 0; i < nums.length; i++) {
        devideNumber = nums[i];
        devideNumber = devideNumber / 10;
        digitCount++;
        
        while (devideNumber >= 1) {
            devideNumber = devideNumber / 10;
            digitCount++;
        }
        
        if (!(digitCount % 2)) {
            count++;
        }
        digitCount = 0;
    }
    
    return count;
};

 

Runtime: 65 ms
Memory Usage: 43.7 MB

 

https://shoark7.github.io/programming/algorithm/3-ways-to-get-length-of-natural-numberhttps://shoark7.github.io/programming/algorithm/3-ways-to-get-length-of-natural-number

 

자연수의 자릿수를 구하는 3가지 방법

자연수의 길이, 즉 자릿수를 구하는 3가지 방법을 살펴보겠습니다.

shoark7.github.io

이 글을 보니 log를 이용한 방법이라고 나와있는데 javascript에도 log가 있나 검색했더니 있었다! 

Math.log10을 이용하면 위의 블로그 방법과 비슷하게 풀 수 있다.

var findNumbers = function(nums) {
    let count = 0;
    let devideNumber;
    for (let i = 0; i < nums.length; i++) {
        devideNumber = Math.floor(Math.log10(nums[i])) + 1;
        if (!(devideNumber % 2)) {
            count++;
        }
    }
    
    return count;
};
Runtime: 63 ms
Memory Usage: 42.4 MB