본문 바로가기
PS/BOJ

백준 3518 자바 - 공백왕 빈-칸 (BOJ 3518 JAVA)

by Nahwasa 2022. 1. 15.

문제 : boj3518

 

 

  문제는 참 직관적이고 간단한 구현문제인데, 생각보다 꾸현이 까다롭긴 하다. 나온 설명대로 문자열 파싱만 잘 하면 되서 딱히 알고리즘적으로 설명할 건 없다.

 

  주의점은 좀 있다. 첫째로 다음과 같은 경우를 보자.

abc       def
zzz       ggg

이미 문제에서 제시된 방식되로 잘 배치되어 있지만, '사전순으로 가장 앞서는 것'을 출력해야 하므로 공백을 1칸으로 줄여야 한다.

abc def
zzz ggg

 

  두번째로 각 출력문의 마지막에 추가 공백이 있으면 안된다. 딱 출력해야 되는 문장에서 추가 공백 없이 그것만 출력해야 된다. 그 이외에는 백준에서 '출력 형식이 잘못되었습니다'이 뜬다.

 

 

코드 : github

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<String[]> arr = new ArrayList<>();

        int max = 0;
        while (true) {
            String cur = br.readLine();
            if (cur == null) break;
            String[] tmp = cur.trim().split("\\s+");
            max = Math.max(max, tmp.length);
            arr.add(tmp);
        }

        StringBuilder[] res = new StringBuilder[arr.size()];
        for (int i = 0; i < arr.size(); i++) res[i] = new StringBuilder();

        for (int i = 0; i < max; i++) {
            int maxWordLen = 0;
            for (int j = 0; j < arr.size(); j++) {
                String[] cur = arr.get(j);
                if (cur.length-1 < i) continue;
                maxWordLen = Math.max(maxWordLen, cur[i].length());
            }

            for (int j = 0; j < arr.size(); j++) {
                String[] cur = arr.get(j);
                if (cur.length-1 < i) continue;

                res[j].append(cur[i]);
                int gap = maxWordLen - cur[i].length();

                if (cur.length-1 != i) {
                    for (int k = 0; k < gap; k++)
                        res[j].append(' ');
                    res[j].append(' ');
                }
            }
        }

        for (int i = 0; i < arr.size(); i++) {
            if (i == arr.size()-1)
                System.out.print(res[i]);
            else
                System.out.println(res[i]);
        }
    }
}

댓글