https://www.acmicpc.net/problem/9047
9047번: 6174
1949 년 인도 수학자 Kaprekar 는 Kaprekar 연산을 고안해냈다. Kaprekar 연산은 네 자리 수 중 모든 자리수가 같지 않은 수(1111, 2222 등을 제외한)의 각 자리의 숫자를 재배열해서 만들 수 있는 가장 큰 수
www.acmicpc.net
1. algorithm 헤더파일 사용
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int N;
int cnt = 0;
void InputData(){
cin >> N;
}
string findsub(string Nstr){
sort(Nstr.begin(), Nstr.end());
int min = stoi(Nstr);
reverse(Nstr.begin(), Nstr.end());
int max = stoi(Nstr);
cnt++;
return to_string(max - min);
}
int main(){
InputData();
string Nstring = to_string(N);
while (Nstring != "6174")
{
Nstring = findsub(Nstring);
}
cout << cnt << endl;
return 0;
}
- algorithm 헤더파일 사용 (퀵 정렬)
- string 사용
algorithm 헤더파일에 있는 sort 알고리즘을 사용해서 푼 예시이다.
해당 sort 알고리즘은 퀵 정렬을 기반으로 구현되어 있다.
시간 복잡도: nlogn
2. 버블 sort 사용
#include <iostream>
using namespace std;
int N;
int cnt = 0;
void InputData(){
cin >> N;
}
int sortfindsub(int* d){
int asc_num;
int dec_num;
for (int i=3; i>=1; i--){
for(int j=0; j<i; j++){
if(d[j] > d[j+1]){
int tmp = d[j+1];
d[j+1] = d[j];
d[j] = tmp;
}
}
}
asc_num = d[0]*1000 + d[1]*100 + d[2]*10+d[3]*1;
dec_num = d[0]*1 + d[1]*10 + d[2]*100+d[3]*1000;
return dec_num-asc_num;
}
int kaprekar(int N){
int d[4];
for(int i=0; i<4;i++){
d[i] = N%10;
N = N/10;
}
cnt++;
return sortfindsub(d);
}
int main(){
InputData();
while (N != 6174)
{
N = kaprekar(N);
}
cout << cnt << endl;
return 0;
}
- int (배열) 만 사용
- bubble sort : 시간복잡도 O(n^2)
- pointer
으로도 구현해 보았다.
bubble sort 개념을 이해하고 혼자 구현했을 때는 i-- j++ 중첩으로 했는데, 찾아보니 i++ j++ 중첩으로 많이 구현하는 듯 하다.!
'코딩놀이: python C C++' 카테고리의 다른 글
[C++][백준 10799] 쇠막대기, " ' 차이 (0) | 2023.12.15 |
---|---|
[C++] 분수 정렬 (0) | 2023.12.15 |
[C++][TCPschool] 변수와 메모리 (0) | 2023.09.01 |
[C++][TCPschool] iostream (0) | 2023.08.28 |
[C++][TCPschool] C++ 프로그래밍 (0) | 2023.08.28 |