알고리즘/문자열

[BOJ] 백준 13417 - 카드 문자열 풀이

송승현(SSH) 2022. 11. 30. 23:09

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();
    }
}