알고리즘 문제 풀이

LeetCode Find Numbers with Even Number of Digits 풀이 (자바 JAVA)

superbono 2022. 5. 1. 17:11

출처 - https://leetcode.com/explore/learn/card/fun-with-arrays/521/introduction/3237/

 

Explore - LeetCode

LeetCode Explore is the best place for everyone to start practicing and learning on LeetCode. No matter if you are a beginner or a master, there are always new topics waiting for you to explore.

leetcode.com

 

문제 

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

 

기초적인 문제로, 문제에서 주어지는 int형 배열에서 짝수 자리의 수가 몇개 있는지 찾으면 되는 문제이다.

 

테스트케이스 예시

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.

12 는 2자리 수 (짝수 자리의 수)

345는 3자리 수 (홀수 자리의 수)

2는 1자리 수 (홀수 자리의 수)

6은 2자리 수 (홀수 자리의 수)

7896은 4자리 수 (짝수 자리의 수)

따라서 12와 7896 2 개의 수가 짝수자리의 수이므로 2가 정답이 된다 .

 

Example 2:

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

555는 3자리 수 (홀수 자리의 수)

901은 3자리 수 (홀수 자리의 수)

482는 3자리 수 (홀수 자리의 수)

1771은 4자리 수 (짝수 자리의 수)

따라서 1771만 짝수자리의 수이므로 1이 정답이 된다. 

 

제약조건 

Constraints:

  • 1 <= nums.length <= 500
  • 1 <= nums[i] <= 105

 

Solution

first try

class Solution {
    public int findNumbers(int[] nums) {
     
        int numsLength = nums.length;
        int res = 0;
        for (int i = 0; i < numsLength; i++){
            String s = Integer.toString(nums[i]);
            if(s.length() % 2 == 0) {
                res++;
            }
        }
        return res;
    }
}

첫번째 풀이의 실행 결과

Runtime: 2 ms
Memory Usage: 43.7 MB
 

솔직히 쉽게 풀고 싶어서... 첫 번째에는 그냥 주어지는 배열의 크기만큼 루프를 돌게 한 뒤, int형의 데이터를 string 형으로 바꾸어 그 string의 length가 짝수라면 res(최종 정답)을 하나씩 증가시키는 방향으로 풀었다. 그런데 아마 형 변환 때문인지? 실행 속도와 메모리 사용량이 생각보다 높았다. 따라서 다른 방법으로도 풀어보기로 하였다. 

 

second try

class Solution {
    public int findNumbers(int[] nums) {
     
        int numsLength = nums.length;
        int res = 0;
        int cnt = 0;
        for (int i = 0; i < numsLength; i++){
            int now = nums[i];
            while(now > 0){
                now = now / 10;
                cnt++;
            }
            
            if(cnt % 2 == 0){
                res++;
            }
            cnt = 0;
        }
        return res;
    }
}

두번째 풀이의 실행 결과

Runtime: 2 ms
Memory Usage: 41.9 MB

 

두번재 풀이는 자릿수를 알아내는 알고리즘의 기본적이고 정석적인? 방법인 0이 아닐 때까지 10으로 나누는 방법으로 풀었다. 메모리의 사용량을 2mb 정도 줄일 수 있었다. 

그랬더니 실행 속도는 같지만 메모리 사용량을 많이 줄일 수 있었다. 아무래도 string은 reference type, int는 primitive type이기 때문에 이 부분에서 메모리의 사용량이 갈리는 것 같은데 자세한 부분은 좀 더 찾아봐야겠다.