View

LeetCode :: Happy Number (Java)

curioser 2021. 3. 6. 14:01

😃 || 정리

주어진 숫자의 각 자릿수를 2 제곱해서 더한 수가 최종적으로 1이 되면 happy number로 true를 반환하고, 그렇지 않으면 false를 반환하게 된다. 어떤 규칙이 있을까 2~10까지 숫자를 직접 해본 결과 happy number가 아니면 같은 수가 반복되어 나오는 것을 알게 되었다.

그래서 배열에 합계들을 넣고 , 중복이 되면 안되므로 Set 컬렉션을 쓰기로 했다. 그리고 만약 중복되는 숫자가 들어오면 false를 반환하도록 만들기로 했다.

😃 || 풀이 방법

import java.util.*;

class Solution {
    public boolean isHappy(int n) {
        String num = n + "";

        HashSet<Integer> unHappySet = new HashSet<Integer>();

        boolean tf = true;
        while(tf){
           int sum = 0;
           for(int i=0 ; i<num.length(); i++){
              sum += (int)Math.pow(num.charAt(i) - '0',2);
           }

            if(sum == 1){
                return true;
            }else{
                tf = unHappySet.add(sum);
            }
            num = sum + "";
        }
        return false;
    }
}

통과는 했지만 속도도 꽝이고
String 변수가 계속 선언되어서 그런지 메모리도 엄청 잡아먹었다.

😃 || 코드 배우기

빠르게 실행되는 결과를 보니 예시를 하나 볼 수 있었다.

import java.util.*;

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();

        while(!set.contains(n)) {
            set.add(n);

            int temp = n;
            n = 0;

            while(temp != 0) {
                n += (temp % 10) * (temp % 10);
                temp /= 10;
            }

            if(n == 1)
                return true;
        }
        return false;
    }
}

내가 풀었던 방식은 각 자리수의 값을 charAt메서드를 이용해서 가져온 후 제곱해주는 것이었는데
여기서는 10으로 나눠서 나온 나머지 , 즉 끝자리의 값을 제곱해서 더해주고
다시 10으로 나누어서 자리수를 줄여주고 하는 식으로 각 자리의 값을 가져오도록 만들었다.
이렇게 하니 확실히 속도가 확연히 줄어들었다..

각 자리수를 구하게 된다면 % 와 / 연산자를 잘 활용할 것!

Share Link
reply
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31