코딩문제풀이/Baekjoon
[Java] 백준 9081번 : 단어 맞추기
코딩하는 포메라니안
2023. 3. 21. 12:08
문제
https://www.acmicpc.net/problem/9081
9081번: 단어 맞추기
입력의 첫 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 하나의 단어가 한 줄로 주어진다. 단어는 알파벳 A~Z 대문자로만 이루어지며 항상 공백이 없는 연속된 알
www.acmicpc.net
풀이 과정
주어진 문자열을 숫자로 나타내면 다음과 같이 볼 수 있다.
abcde fghij klmno pqrst uvwxy z
HELLO = 8 5 12 12 15
DRINK = 4 18 9 14 11
SHUTTLE = 19 8 21 20 20 12 5
여기서 다음 수를 구할 때는, 뒤에서 부터 봤을 때 오름차순으로 올라가다가 꺾이는 지점의 수(top) 이전 값과 그 이후의 숫자 중 다음으로 큰 값과 교체한다. 그리고나서 top 이후의 숫자들 모두 오름차순 정렬을 하면 된다.
예를 들어 SHUTTLE 같은 경우, 꺾이는 지점은 8이고 8 이후의 숫자 중에서 8 다음으로 큰 숫자는 12이다. top이후의 숫자는 내림차순으로 되어있기 때문에 앞&뒤를 swap해가면서 오름차순 정렬을 빠르게 하면 된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while(T-- > 0){
char[] input = br.readLine().toCharArray();
int lastIdx = input.length - 1;
//1. 꼭대기 구하기
int top = lastIdx;
while(top > 0 && input[top - 1] >= input[top]){
top--;
}
if(top > 0){
//2. 꼭대기랑 swap할 큰값고르기
int pos = lastIdx;
while(input[top-1] >= input[pos]) pos--;
//3. swap하고, 오름차순 정렬하기
swap(input, top-1, pos);
while(top < lastIdx){
swap(input, top, lastIdx);
top++;
lastIdx--;
}
}
for(char c : input){
sb.append(c);
}
sb.append("\n");
}
System.out.println(sb);
}
public static void swap(char[] input, int i, int j){
char temp = input[i];
input[i] = input[j];
input[j] = temp;
}
}