1. 문제
https://www.acmicpc.net/problem/13417
13417번: 카드 문자열
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각각의 테스트 케이스의 첫째 줄에 처
www.acmicpc.net
2. 풀이
실버 3의 문자열 구현 문제이다.
이 문제의 핵심은 문제에도 설명이 나와 있는 "만들 수 있는 카드 문자열 중 사전 순으로 가장 빠른 문자열을 출력하는 프로그램을 작성"이라는 문구이다.
먼저 입력으로 주어지는 테스트 케이스만큼 반복문을 구성하고 String 배열로 입력을 받는다. (12줄)
문제에서 첫 번째 카드는 기본으로 맨 왼쪽의 카드를 놓는다고 했으므로 미리 선언했던 버퍼에 첫 번째 문자를 담는다. (13, 15줄)
이제 입력 받은 문자열에서 첫 번째 카드를 제외한 나머지 문자를 반복문으로 탐색하면서 현재 버퍼에 들어있는 문자의 가장 왼쪽 문자의 아스키 코드 값이 탐색한 문자의 아스키 코드값보다 크다면 버퍼의 맨 앞에 insert하고, 아니라면 맨 뒤에 append를 해준다. (16~23줄)
사전순으로 가장 빠른순이라는 것은 만들 수 있는 문자열 중 문자열의 앞에서부터 아스키 코드 값이 가장 작은 것을 의미하기 때문이다.
마지막으로 버퍼에 있는 내용을 출력해주면 정답!!!
3. 소스 코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
int length = Integer.parseInt(br.readLine());
String[] inputString = br.readLine().split(" ");
StringBuffer sb = new StringBuffer();
sb.append(inputString[0]);
for (int i = 1; i < inputString.length; i++) {
String bufferString = sb.toString();
if (bufferString.charAt(0) - '0' >= inputString[i].charAt(0) - '0') {
sb.insert(0, inputString[i]);
} else {
sb.append(inputString[i]);
}
}
bw.write(sb.toString() + "\n");
}
bw.flush();
bw.close();
br.close();
}
}