관리 메뉴

어읽로꾸거

BOJ 1038 감소하는 수 본문

알고리즘

BOJ 1038 감소하는 수

어읽로꾸거 2019. 9. 15. 08:49

백준 1038 링크

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

 

1038번: 감소하는 수

음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 출력하는 프로그램을 작성하시오. 0은 0번째 감소하는 수이고, 1은 1번째 감소하는 수이다. 만약 N번째 감소하는 수가 없다면 -1을 출력한다.

www.acmicpc.net

풀이

처음엔 DP를 이용하여 규칙성을 발견해서 풀려고 시도해 특정 구간까지 DP로 도달해서 브루트포스로 도달하는 방법을 시도해 보았지만 시간초과가 났고, 생각하던중 큐를 이용하여 푸는 방법을 생각해 내서 풀었음.

 

예를 들어 763이라는 수를 큐에서 꺼냈으면 다시 큐에다 7630, 7631, 7632를 넣는 식으로 풀었다.

 

가장 마지막수는 오버플로우가 나서 따로 출력해 주었음.

코드

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;

int main() {
	//freopen("input.txt","r",stdin);
	
	int count, input, now_value;
	queue <int> q;
	count = 0;
	cin>>input;
	
	for(int i=0;i<10;i++){
		q.push(i);
	}
	
	if(input == 1022){
		cout<<9876543210;
		return 0;
	}
	else if(input>1022){
		cout<<-1;
		return 0;
	}
	
	while(1){
		now_value = q.front();
		q.pop();
		if(count++ == input){
			cout << now_value;
			break;
		}
		for(int i = 0; i < now_value%10; i++){
			q.push(now_value*10 + i);
		}
	}
}

'알고리즘' 카테고리의 다른 글

BOJ 3187 양치기 꿍  (0) 2019.09.15
BOJ 14613 너의 티어는?  (0) 2019.09.15
BOJ 17141 연구소 2  (0) 2019.09.13
BOJ 6186 Best Grass  (0) 2019.04.23
BOJ 13549 숨바꼭질3  (0) 2019.04.22