알고리즘/[ Baekjoon ]

[ BOJ ][JAVA][16719] ZOAC

kim.svadoz 2021. 5. 26. 17:59
728x90
반응형

https://www.acmicpc.net/problem/16719

 

16719번: ZOAC

2018년 12월, 처음 시작하게 된 ZOAC의 오프닝을 맡은 성우는 누구보다 화려하게 ZOAC를 알리려 한다. 앞 글자부터 하나씩 보여주는 방식은 너무 식상하다고 생각한 성우는 문자열을 보여주는 새로

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 620 298 243 51.812%

문제

2018년 12월, 처음 시작하게 된 ZOAC의 오프닝을 맡은 성우는 누구보다 화려하게 ZOAC를 알리려 한다.

앞 글자부터 하나씩 보여주는 방식은 너무 식상하다고 생각한 성우는 문자열을 보여주는 새로운 규칙을 고안해냈다!

규칙은 이러하다. 아직 보여주지 않은 문자 중 추가했을 때의 문자열이 사전 순으로 가장 앞에 오도록 하는 문자를 보여주는 것이다.

예를 들어 ZOAC를 보여주고 싶다면, A → AC → OAC → ZOAC 순으로 보여주면 된다.

바쁜 성우를 위하여 이 규칙대로 출력해주는 프로그램을 작성하시오.

입력

첫 번째 줄에 알파벳 대문자로 구성된 문자열이 주어진다. 문자열의 길이는 최대 100자이다.

출력

규칙에 맞게 순서대로 문자열을 출력한다.

예제 입력 1

ZOAC

예제 출력 1

A
AC
OAC
ZOAC

예제 입력 2

BAC

예제 출력 2

A
AC
BAC

예제 입력 3

STARTLINK

예제 출력 3

A
AI
AIK
AINK
ALINK
ARLINK
ARTLINK
SARTLINK
STARTLINK

코드

/*
    ZOAC
    구현, 문자열 정렬

    int compareTo(String anotherString)
    문자열을 사전순으로 비교, 

    - 두 문자열이 사전 순으로 같다면 0을 반환
    - 대상 문자열 (메서드가 호출된 문자열)이 매개변수로 받은 문자열보다 사전 순으로 앞선 경우 음수를 반환.
    - 대상 문자열 (메서드가 호출된 문자열)이 매개변수로 받은 문자열보다 사전순으로 뒤질 경우 양수를 반환. 
*/

import java.io.*;
import java.util.*;
public class p16719 {
    static class Pair implements Comparable<Pair>{
        String s;
        int idx;
        public Pair (String s, int idx) {
            this.s = s;
            this.idx = idx;
        }

        // 문자열 사전 순으로 정렬하는 부분
        public int compareTo(Pair o) {
            if (s.compareTo(o.s) > 0) {
                return 1;
            } else if (s.compareTo(o.s) < 0) {
                return -1;
            } else { // 이 else 구문이 없으면 illegalArgument Exception이 발생한다.
                return 0;
            }
        }
    }
    static String input;
    static boolean[] visited;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        input = br.readLine();
        char[] arr = input.toCharArray();
        visited = new boolean[arr.length];

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            sb.setLength(0);
            List<Pair> list = new ArrayList<>();
            for (int j = 0; j < arr.length; j++) {
                if (!visited[j]) {
                    String temp = "";
                    for (int k = 0; k < arr.length; k++) {
                        if (j == k || visited[k]) {
                            temp += arr[k]+"";
                        }
                    }
                    list.add(new Pair(temp, j));
                }
            }
            Collections.sort(list);
            sb.append(list.get(0).s);
            visited[list.get(0).idx] = true;
            System.out.println(sb.toString());
        }
    }
}

시간복잡도 개선(DFS 풀이)

import java.io.*;
import java.util.*;
public class p16719 {
    private static BufferedReader br;
    private static BufferedWriter bw;

    static String input;
    static boolean[] visited;

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        bw = new BufferedWriter(new OutputStreamWriter(System.out));

        input = br.readLine();
        visited = new boolean[input.length()];

        zoac(0, input.length() - 1);

        bw.flush();
        bw.close();
        br.close();
    }

    private static void zoac(int left, int right) throws IOException {
        if (left > right) return;

        int idx = left;

        // left와 right 사이에 있는 글자중 사전식 순서가 가장 낮은 글자를 찾는다.(idx)
        for (int i = left; i <= right; i++) {
            if (input.charAt(idx) > input.charAt(i)) {
                idx = i;
            }
        }
        visited[idx] = true;

        for (int i = 0; i < input.length(); i++) {
            if (visited[i]) {
                bw.write(input.charAt(i));
            }
        }
        bw.newLine();

        // 여기도 순서가 안맞으면 틀렸습니다를 확인할 수 있다.
        // 반드시 이 dfs 순서로 재귀를 구현해야 한다.
        // 그래야 사전식 순서가 맞춰진다.
        zoac(idx + 1, right);
        zoac(left, idx  - 1);
    }
}
728x90
반응형

'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글

[ BOJ ][JAVA][10427] 빚  (0) 2021.05.27
[ BOJ ][JAVA][20495] 수열과 헌팅  (0) 2021.05.26
[ BOJ ][JAVA][1368] 물대기  (0) 2021.05.26
[ BOJ ][JAVA][14267] 회사 문화 1  (0) 2021.05.25
[ BOJ ][JAVA][10025] 게으른 백곰  (0) 2021.05.25