본문 바로가기
개인 공부/코딩테스트

[C++][leetcode] happy numbers :: seoftware

by seowit 2020. 4. 3.

문제

 

접근방법

 

무한루프에 빠지게 되는 조건이 뭘까? 똑같은 숫자가 또 나오면 무한루프에 빠진다!

따라서, 루프를 돌 때마다 나오는 결과값을 저장해 놨다가 또 나오는지 확인하는 과정이 필요하다.

 

소스코드

 

class Solution {
    bool isVisited(int x, vector<int>&arr){
        if(arr.empty()) return false;
        for(int i : arr){
            if(x==i) return true;
        }
        return false;
    }
public:
    bool isHappy(int n) {
        vector<int> arr;
        int m = n; int cur;
        while(1){
            cur = 0;
            while(m>0){
                cur += (m%10)*(m%10);
                m /= 10;
            }
            if(cur == 1) return true;
            if(isVisited(cur, arr)) return false;
            arr.push_back(cur);
            m = cur;
        }
    }
};

1. isVisited 함수가 이 전에 같은 숫자가 있는지 확인하는 기능을 담당한다.

2. while문의 안에 있는 while문은 모든 자리의 제곱을 더해준다.

3. 2번의 결과값이 1이 나오면 true를 return 하여 반복을 종료한다.

4. 2번의 결과값이 1이 아닌 경우 그 값이 처음 나오는 것인지 전에도 나왔던 값인지 isVisited로 확인한다. 만약 나왔던 값이라면 무한루프 확정이므로 false를 return 하여 반복을 종료한다.

5. 3과 4의 경우를 제외하고는 계산을 계속하여 n이 happy number인지 알아봐야 하므로 현재 루프에서 계산된 값을 배열에 저장하고 다음 루프를 돈다(2~4번 과정 반복).

댓글