티스토리 뷰

코딩 테스트/백준

백준 2231 분해합 c++

상어악어 2022. 1. 12. 18:31
반응형
#include <iostream>
#include <string>
#include <math.h>

using namespace std;

int main() {

	int length, n, digit,sum=0;	
    //length는 몇자리 수 인지, n은 사용자로부터 입력받을 수
    //digit은 각 자릿수
    //sum은 자기자신과 각자릿수를 더한 값
    
	string str;		//문자열로 받아줌 그 이유는 몇자리 수인지 알기 위해
	cin >> str;

	length = str.length();		//length에 몇자리 수인지 할당
	n = stoi(str);				//int로 바꿔 n에다 다시 저장
	int result = n;				//result초기값을 n으로 할당후
    							//반복문을 돌아도 그대로 n이면 생성자가 없다고 판단

	
	//(n / 10 ^ (k - 1)) % 10		//핵심적 코드 각 자릿수 추출
	
	for (int i = n - 1; n-9*length <= i; i--) {	//반복문은 n-1~ n-9*length
    											// n-1 ~1까지 돌면 너무 비효율적이니까
                                                // 대충 끝내는 구간을 임의로 정함
		sum = 0;
		for (int k = length; k >= 1; k--) {	
			digit = (i / (int)pow(10, k - 1))%10;	//각자릿수 추출해
			sum += digit;	//sum에 더해줌
		}
		sum += i;	//자기자신 더함
		if (sum == n) {	//sum과 n이 같다면 생성자임
			if (i < result)	//그리고 최솟값을 찾는것이므로 현재 result값보다 i가 작으면
				result = i;		//최신화해줌
		}

	}

	
	if (n == result) {		//n==result인 경우는 생성자가 없는경우
		cout << "0"<<endl;
		return 0;
	}
	else {		//그외에는 result값이 최소생성자
		cout << result << endl;
	}


	return 0;
}

 

 

 

숫자 n이 있을때 k번째 자릿수의 숫자를 추출하는 코드

(k는 1의자리, 10의자리, 100의자리 등..에따라 1,2,3...식으로 증가한다)

 

(n/10^(k-1))%10

 

c++ math.h라이브러리를 사용하면

(n/(int)pow(10,k-1))%10

 

그동안 이거를 모르고 일일히 일의자리, 십의자리, 백의자리마다 다르게 코드를짰다

그런데 7자리수까지 가버리니까 너무 힘들어서

검색해본 결과 이런 좋은 코드가 있었다

 

반응형

'코딩 테스트 > 백준' 카테고리의 다른 글

백준 10989 counting sort c++  (0) 2022.01.19
백준 2751번 merge sort c++  (0) 2022.01.18
백준 1018 c++  (0) 2022.01.13
에라토스테네스의 체(백준 1929 c++)  (0) 2022.01.06
백준 1712번 c++  (0) 2021.12.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함