문제
문제 바로가기> BOJ 9047번: 6174
풀이 1
타입을 문자열과 정수로 변환해가며 풀었다!
이때 정수 -> 문자열로 변환하는 과정에서 0089 같은 것이 나올 수 있으므로 자리 수를 맞춰주는 연산을 추가로 진행해주었다.
이런 과정을 거치지 않으려면, 풀이2와 같은 방법으로 풀 수도 있다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#define SIZE 4
using namespace std;
int main(){
int TC; cin >> TC;
while(TC--){
string N; cin >> N;
int ans = 0, maxVal, minVal, diff = stoi(N);
while (diff != 6174){
vector<char> v;
string minStr="", maxStr="";
for(char c : N) v.push_back(c);
sort(v.begin(), v.end());
for(int i=0; i<SIZE; i++){
minStr = minStr + v[i];
maxStr = maxStr + v[SIZE-i-1];
}
minVal = stoi(minStr);
maxVal = stoi(maxStr);
diff = maxVal - minVal;
N = to_string(diff);
while(N.size() < SIZE) N = "0" + N;
ans++;
}
cout << ans << "\n";
}
}
풀이 2
문자열을 사용하지 않고, %와 /를 통해 각 자리 수를 구해서 문제를 해결할 수 있다!
#include <iostream>
#include <algorithm>
#define SIZE 4
using namespace std;
int TC, N;
int kaprekar(int num){
int arr[SIZE];
for (int i = 0; i < SIZE; i++){
arr[i] = num % 10;
num /= 10;
}
sort(arr, arr + SIZE);
return (arr[3]*1000 + arr[2]*100 + arr[1]*10 + arr[0]) - (arr[0]*1000 + arr[1]*100 + arr[2]*10 + arr[3]);
}
int main(){
cin >> TC;
while(TC--){
cin >> N;
int ans=0, num = N;
while (num != 6174){
num = kaprekar(num);
ans++;
}
cout << ans << "\n";
}
}
'문제 풀이 > 백준' 카테고리의 다른 글
BOJ 8983번: 사냥꾼 (0) | 2023.12.22 |
---|---|
BOJ 1079번: 쇠막대기 (0) | 2023.12.15 |
BOJ 2304번: 창고 다각형 (0) | 2023.09.05 |
BOJ 17485번: 진우의 달 여행 (Large) (0) | 2023.09.04 |
BOJ 2230번: 수 고르기 (0) | 2023.09.03 |