코딩테스트
백준 - 9081 번 단어 맞추기
NellKiM
2025. 4. 12. 14:55
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main_9081_단어맞추기 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testCase = Integer.parseInt(br.readLine());
for(int i=1; i<=testCase; i++) {
String word = br.readLine();
//각번지의 알파벳 문자를 비교하기 위하여 문자열 배열로 변환
char [] array =word.toCharArray();
nextPermutation(array);
System.out.println(new String(array));
}
br.close();
}//main
private static void nextPermutation(char[] array) {
// Step 1: a<b 를 만족하는 두 수 찾기!! ==> 기준점(인덱스) 찾기
// arr[i]< arr[i+1]
// 위의 식을 만족하는 것을 찾는데 가장 오른쪽에 있는것을 선택
// 그리고 arr[i]의 i가 기준점(피벗)이 된다!!
int i=array.length-2;
/*
------------------
D R I N K
------------------
index 0 1 2 3 4
------------------
B O O
------------------
index 0 1 2
*/
while(i>=0 && array[i] >= array[i+1] ) { //i>=0 : 반복문에서 배열의 인덱스를 벗어나는 참조를 하지 않기 위해
//array[i] >= array[i+1] ==> 계속 i값을 감소하며
//array[i] < array[i+1] 를 만족하는 인덱스를 찾기 위해
i--;
}
//다음 순열이 없다면 (전체 내림차순이라면)
// if(i==-1)return;
if(i<0)return;
// Step 2: i번지의 값보다 큰값을 뒤에서 부터 찾기!! ==>찾았으면 swap
int j=array.length-1;
while(array[i] >= array[j] ) {
j--;
}
char temp = array[i];
array[i] = array[j];
array[j] = temp;
// Step 3: i번지 뒤의 숫자들을 오름차순으로 정렬 (반전)
int start=i+1 , end=array.length-1;
while(start < end) {
//앞뒤 교환
temp = array[start];
array[start] = array[end];
array[end] = temp;
//시작번지 증가, 끝번지 감소
start++; end--;
}
//4
//HELLO
//DRINK
//SHUTTLE
//ZOO
}
}