문제출처: 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 |