본문 바로가기

Hub Algorithm/문자열

[BOJ] 백준 6137 : 문자열 생성 (java)

728x90

🧪 6137 문자열 생성


난이도 : 🌟 골드 4
유형 : 문자열

 

6137번: 문자열 생성

첫 번째 줄에 문자열 S의 길이 N이 주어진다. (N <= 2,000) 이후 N개의 줄에 S를 이루는 문자들이 주어진다.

www.acmicpc.net

 

📝 문제


 

N개의 문자로 이루어진 문자열 S가 입력된다.

이 문자열의 각 문자들로 새로운 문자열 T를 만들려고한다.

문자열 S로 문자열 T를 만드는 규칙은 다음과 같다.

  • 문자열 S의 가장 앞의 문자 하나를 문자열 T의 마지막에 추가한다.
  • 문자열 S의 가장 뒤의 문자 하나를 문자열 T의 마지막에 추가한다.

위 규칙으로 만들어진 문자열 T들 중 사전순으로 가장 빠른 문자열을 출력하는 프로그램을 작성하시오.

 

입력

 

첫 번째 줄에 문자열 S의 길이 N이 주어진다. (N <= 2,000)

이후 N개의 줄에 S를 이루는 문자들이 주어진다.

 

출력

 

만들어진 사전순으로 가장 빠른 문자열을 출력한다. 80글자마다 새줄 문자를 출력해야 한다.

 

🚧  주의할 점


1. 문자열 S가 하나의 문자만 남은 경우 마지막에 추가해준다.

 

🧐 핵심 로직


  문자열 S의 가장 앞의 문자와 문자열 S의 가장 뒤의 문자를 비교해서 작은 문자를 새로운 문자열에 추가해준다.

  이때, 문자열 S의 가장 앞과 뒤의 문자가 같다면 둘이 다를때 까지 반복하고 끝까지 같은 문자만 존재한다면 앞 혹은 뒤의 어느 문자든 새로운 문자열에 추가해주고 1번부터 다시 반복한다.

 

💻 최종 코드 (152 ms)


import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {

        // BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader br = new BufferedReader(new FileReader("input.txt")); 

        int n = Integer.parseInt(br.readLine());
        List<String> wordGroup = new ArrayList<>();
        for (int i=0; i<n; i++) {
            wordGroup.add(br.readLine());
        }

        List<String> newWord = new ArrayList<>();
        StringBuilder result = new StringBuilder();
        for (int i=0; i<n-1; i++) {
            if (wordGroup.get(0).compareTo(wordGroup.get(wordGroup.size() - 1)) > 0) {
                newWord.add(wordGroup.get(wordGroup.size() - 1));
                wordGroup.remove(wordGroup.size() - 1);
            }
            else if (wordGroup.get(0).compareTo(wordGroup.get(wordGroup.size() - 1)) < 0) {
                newWord.add(wordGroup.get(0));
                wordGroup.remove(0);
            }
            else {
                int j = 1;
                while (j < wordGroup.size() && wordGroup.get(j).compareTo(wordGroup.get(wordGroup.size() - 1 - j)) == 0) {
                    j++;
                }

                if (j == wordGroup.size()) {
                    newWord.add(wordGroup.get(0));
                    wordGroup.remove(0);
                } else if (wordGroup.get(j).compareTo(wordGroup.get(wordGroup.size() - 1 - j)) > 0) {
                    newWord.add(wordGroup.get(wordGroup.size() - 1));
                    wordGroup.remove(wordGroup.size() - 1);
                } else {
                    newWord.add(wordGroup.get(0));
                    wordGroup.remove(0);
                }
            }

            if (newWord.size() == 80) {
                result.append(String.join("", newWord)).append("\n");
                newWord.clear();
            } 
        }

        result.append(String.join("", newWord)).append(wordGroup.get(0));

        System.out.println(result.toString());
    }
}

'Hub Algorithm > 문자열' 카테고리의 다른 글

[BOJ] 백준 17828 : 문자열 화폐 (java)  (2) 2024.02.04