문제출처: https://www.acmicpc.net/problem/14954


풀이

영어로된 문제라 당연스럽게 구글번역으로 한글로 바꿔서 풀었습니다ㅋㅋ;

문제를 요약하면, N의 자릿값을 계속 더해나갈 때 그 값이 언젠간 1이 되면 Happy number가 되고, 아닐 시 Unhappy number가 됩니다.

아닐 경우 문제에서 예로 들어준 5를 보면

5-> 25-> 29-> 85-> 89-> 145-> 42-> 20->4->16->37->58->89->----- 순으로 이어지는데 결국 기존에 나왔던 89가 또한번 나타나므로 

결국,  수식을 계속 계산해나갈 때 기존의 값이 또 나오면 Unhappy number임을 알 수 있습니다.

핵심은 한번 계산할 때 마다 담아놨던 값들에 대해서 일일히 또 나타나는 값인지 확인해야한다는 것입니다.

그 과정에서 주석 친 29~31행위치에 코드를 작성하지 않도록 주의하면 될 것 같습니다.


코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v;
int main()
{
    int n, temp = 0;
    cin >> n;
    if (n == 1)
    {
        cout << "HAPPY" << endl;
        return 0;
    }
    temp = n;
    int num = 0;
    while (1)
    {
        while (temp)
        {
            num += (temp % 10* (temp % 10);
            temp /= 10;
        }
        if (num == 1)
        {
            cout << "HAPPY" << endl;
            return 0;
        }
        /*v.push_back(num);
        temp = num;
        */
        //누적되어있는 값들중에서 기존에있었던 값인지확인
        for (int i = 0; i < v.size(); i++)
        {
            if (v[i] == num)
            {
                cout << "UNHAPPY" << endl;
                return 0;
            }
        }
        //재시작
        v.push_back(num);
        temp = num;
        num = 0;
    }
    
    
}
cs


결과



'문제풀이(BOJ) > 규칙찾기' 카테고리의 다른 글

[백준 1676] 팩토리얼 0의 개수  (0) 2020.08.27
[백준 1652] 누울 자리를 찾아라  (2) 2020.01.15
[백준 1855] 암호  (0) 2020.01.06
[백준 3076] 상근이의 체스판  (0) 2020.01.03
[백준 1551] 수열의 변화  (0) 2020.01.03

+ Recent posts