danbibibi
article thumbnail
Published 2023. 12. 11. 17:00
BOJ 9047번: 6174 문제 풀이/백준

1. 문제

문제 바로가기> BOJ 9047번: 6174

 

9047번: 6174

입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스마다 한 줄에 네 자리 수(1000~9999)가 하나씩 주어진다. 단,

www.acmicpc.net

 

2. 풀이 1

타입을 문자열과 정수로 변환해가며 풀었다!

이때 정수 -> 문자열로 변환하는 과정에서 0089 같은 것이 나올 수 있으므로 자리 수를 맞춰주는 연산을 추가로 진행해주었다.

이런 과정을 거치지 않으려면, 풀이2와 같은 방법으로 풀 수도 있다.

<cpp />
#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"; } }

 

3. 풀이 2

문자열을 사용하지 않고, %와 /를 통해 각 자리 수를 구해서 문제를 해결할 수 있다!

<cpp />
#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
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로