문제 : https://www.acmicpc.net/problem/2697 

 

2697번: 다음수 구하기

첫째 줄에 테스트 케이스의 개수 T(1<=T<=1,000)가 주어진다. 둘째 줄부터 T개 줄에는 각 테스트 케이스가 주어진다. 테스트 케이스는 한 줄로 이루어져 있으며, 수 A이다. A는 최대 80자리 자연수이다

www.acmicpc.net

문제 요약 : 주어진 수와 구성이 같으면서 다음으로 큰 수 출력

입력 출력
1 ≤ N ≤ 10^81-1
구성이 같은 다음으로 큰 수 출력
큰 수가 없을 경우 BIGGEST 출력

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_2697.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30895598 cbkpar 2697 맞았습니다!! 14084KB 120ms Java 11 865B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int t,sz,i,j;
		t = Integer.parseInt(br.readLine());
		while(t-->0) {
			String str = br.readLine();
			sz = str.length();
			int[] cnt = new int[10];
			for(i=sz-1;i>0;i--)	if(str.charAt(i-1)<str.charAt(i)) {
				for(j=i-1;j<sz;j++) cnt[str.charAt(j)-'0']++;
				sb.append(str.substring(0, i-1));
				for(j=str.charAt(i-1)-'0'+1;j<10;j++) if(cnt[j]>0) {
					cnt[j]--;
					sb.append(j);
					break;
				}
				for(j=0;j<10;j++) while(cnt[j]-->0)	sb.append(j);
				sb.append("\n");
				break;
			}
			if(i==0) sb.append("BIGGEST\n");
		}
		System.out.println(sb);
	}
}

주어진 수를 뒤에서 부터 보며 내림차순이 시작되는 지점을 찾고

처음부터 그 지점전까지 출력한 후

그 지점부터 끝까지 숫자를 모아 해당 지점보다 크며 가장 작은 수를 하나 출력하고

나머지 숫자를 오름차순 정렬 하여 출력한다.

 

내림차순이 시작되는 지점이 없을 경우 BIGGEST를 출력한다.

 

예제 ) 

279134399742

+ Recent posts