본문 바로가기

백준

백준1527 - 금민수의 개수

https://www.acmicpc.net/problem/1527

 

1527번: 금민수의 개수

첫째 줄에 A와 B가 주어진다. A는 1보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. B는 A보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

중복순열을 이욯하여 푸는 문제다. 중복순열이란 중복하여 수를 뽑고 뽑은 순서가 다르면 다른 경우로 인식하는 것이다. 재귀호출을 이용하여 구현하였다. 4와 7로 이루어진 수를 주어진 범위안에서 찾으면 된다.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int mat[2] = { 4,7 }; //4와 7이 중복순열의 원소다
vector<int> goldminsu; //금민수
vector<long long int> v; //중복순열을 진행하며 담아놓을 벡터

//중복순열함수, 첫번째 인자는 현재 뽑은 갯수, 두번째 인자는 뽑아야 되는 갯수
void RPerm(int want_size, int n) {
	if (want_size == n) { //현재 뽑은 갯수와 뽑아야 되는 갯수가 같으면
		
		//뽑은 숫자들을 조합하여 문자열로 바꿔 저장한다.
		string input; 
		for (int i = 0; i < v.size(); i++) { 
			input = input + char(v[i] + '0');
		}
		goldminsu.push_back(stoi(input));
		return;
	}

	//숫자 두 개로 중복순열을 뽑는다. 재귀함수 사용
	for (int i = 0; i < 2; i++) {
		v.push_back(mat[i]);
		RPerm(want_size + 1, n);
		v.pop_back(); //사용한 수는 맨 뒤에 수이고 그 수를 삭제한다.
	}
}

int main() {
	int start, stop; //start는 시작범위, stop은 끝날 범위
	int cnt = 0; //조건에 맞는 숫자의 갯수

	cin >> start >> stop;

	//1자리부터 9자리수까지 4와 7로 이루어진 수를 모두 찾는다.
	for (int i = 1; i <= 9; i++) {
		RPerm(0, i);
	}
	
	//범위에 해당하면 센다.
	for (int i = 0; i < goldminsu.size(); i++) {
		if (start <= goldminsu[i] && goldminsu[i] <= stop) {
			cnt++;
		}
	}

	cout << cnt;

'백준' 카테고리의 다른 글

백준17202 - 핸드폰 번호 궁합  (0) 2019.08.19
백준13300 - 방 배정  (0) 2019.08.18
백준2477 - 참외밭  (0) 2019.08.14
백준16936 - 나3곱2  (0) 2019.08.13
백준1339 - 단어 수학  (0) 2019.08.13