문제 : 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

'백준온라인' 카테고리의 다른 글
| [백준온라인] 10570번 Favorite Number (0) | 2021.07.17 |
|---|---|
| [백준온라인] 5671번 호텔 방 번호 (0) | 2021.07.16 |
| [백준온라인] 12760번 최후의 승자는 누구? (0) | 2021.07.14 |
| [백준온라인] 5698번 Tautogram (0) | 2021.07.13 |
| [백준온라인] 22115번 창영이와 커피 (0) | 2021.07.12 |