공부기록

202. Happy Number 본문

코테/LeetCode

202. Happy Number

코타쿠 2022. 2. 28. 09:24

문제

https://leetcode.com/problems/happy-number/

내 코드

1차 코드 (시간복잡도 O(N), 공간복잡도 O(N))

import java.util.*;

class Solution {

    public int makeSum(int n){
        int tmp = n;
        int sum = 0;
        while(tmp != 0){
            int rem = tmp%10;
            sum += (rem*rem);
            tmp/=10;
        }
        return sum;
    }

    public boolean isHappy(int n) {
        Set<Integer> s = new HashSet<>();
        int curNum = n;
        while(true){
            if(s.contains(curNum))
                break;
            s.add(curNum);
            curNum = makeSum(curNum);
            if(curNum == 1)
                return true;
        }
        return false;
    }
}

그냥 set으로 history를 저장해줌. 직관적인 생각이었다.

2차 코드 (시간복잡도 O(N), 공간복잡도 O(1))

import java.util.*;

class Solution {

    public int makeSum(int n){
        int tmp = n;
        int sum = 0;
        while(tmp != 0){
            int rem = tmp%10;
            sum += (rem*rem);
            tmp/=10;
        }
        return sum;
    }

    public boolean isHappy(int n) {
        //무한루프는 회기한다. 
        //slow는 한 칸씩, fast는 두 칸씩 회기하다 보면
        //언젠가는 만날 것이다. - floyd cycle detection
        int slow, fast;
        slow = fast = n;
        do {
            slow = makeSum(slow);
            fast = makeSum(makeSum(fast));
        }while(slow != fast);
        if(slow == 1) return true;
        return false;
    }
}

대충, 무한루프를 돌면 한 칸씩 움직이는 slow와 두 칸씩 움직이는 fast가 언젠가는 만날 것이고, 1로 끝나면 결국 둘다 1에서 만날 것이다.
이는 플로이드 순환 찾기 알고리즘의 내용이다.
https://snutiise.github.io/Floyd's-Cycle-Detection-Algorithm/

'코테 > LeetCode' 카테고리의 다른 글

242. Valid Anagram  (0) 2022.03.14
1626. Best Team With No Conflicts  (0) 2022.03.06
134. Gas Station  (0) 2021.06.06
97. Interleaving String  (0) 2021.06.04
395. Longest Substring with At Least K Repeating Characters  (0) 2021.06.01