극동대학교\AI컴퓨터공학과\JAVA/프로그래머스 코딩 기초 트레이닝

[프로그래머스, LV.0] 접미사 배열

sundori 2023. 6. 23. 23:19

목차

     

    #1 접미사 배열

    문제 설명

    어떤 문자열에 대해서 접미사는 특정 인덱스부터 시작하는 문자열을 의미합니다. 예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다.
    문자열 my_string이 매개변수로 주어질 때, my_string의 모든 접미사를 사전순으로 정렬한 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

    제한사항

     

    • my_string은 알파벳 소문자로만 이루어져 있습니다.
    • 1 ≤ my_string의 길이 ≤ 100

    입출력 예

    my_string result
    "banana" ["a", "ana", "anana", "banana", "na", "nana"]
    "programmers" ["ammers", "ers", "grammers", "mers", "mmers", "ogrammers", "programmers", "rammers", "rogrammers", "rs", "s"]

     

    입출력 예 설명

    #2 코드 및 알고리즘

    import java.util.List;
    import java.util.stream.IntStream;
    import java.util.ArrayList;
    import java.util.Arrays;
    class Solution {
        public String[] solution(String my_string) {
            List<String> list = new ArrayList<>();
            IntStream.range(0, my_string.length()).forEach(value -> {
                list.add(my_string.substring(value,my_string.length()));
            });
            String[] arr = list.stream().toArray(String[]::new);
            Arrays.sort(arr);
            return arr;
    
        }
    }

    풀이:

    • 접미사란
    파생어를 만드는 형태소의 하나. 어떤 단어의 끝에 붙어 새로운 단어가 되게 하는 말. `가위질'의 `-질' 따위. 끝가지. 뒷가지. 발가지. 접미어. 라고하는데 솔직히 어려운 말이다.
    쉽게 이야기 하자면 단어 따위를 뒤집었을 때, 가장 처음에 오는 문자라고 보며, 위의 코드 상에서는 문자열을 뒤집었을 때, 가장 처음에 오는 문자열이라고 보면된다.
    • 이해가 안된다면 밑에 예제 코드를 보자.

     

    public class Main {
        public static void main(String[] args) {
            String my_string = "banana"; // banana의 접미사를 구해보자.
            List<String> list = new ArrayList<>(); // 스택 방식을 사용한다.
            IntStream.range(0, my_string.length()).forEach(value -> {
                list.add(my_string.substring(value,my_string.length()));
                System.out.println(list);
            });
            /*
            * 위의 IntStream을 이용하여 반복문을 구현하는데 알고리즘은 간단하다.
            * 사실 접미사란 banana 같이 이러한 단어만 되는 것이 아니라
            * anana, na, nana 이러한 것도 접미사가 될 수있다.
            * 따라서 banana에서 value를 1씩 증가시키면서 banana 문자열에서
            * 맨 앞위 원소를 하나 씩 짤라가면서 접미사를 구한다.*/
            String[] arr = list.stream().toArray(String[]::new);
            Arrays.sort(arr);
            System.out.println(Arrays.toString(arr));
        }
    }
    --------------------------------------------------------------
    [banana] // 인덱스 0부터 저장
    [banana, anana] // 인덱스 1부터 저장
    [banana, anana, nana] // 인덱스 2부터 저장
    [banana, anana, nana, ana] // 인덱스 3부터 저장
    [banana, anana, nana, ana, na] // 인덱스 4부터 저장
    [banana, anana, nana, ana, na, a]// 인덱스 5부터 저장
    [a, ana, anana, banana, na, nana]// 사전순으로 정렬한 결과
    public class Main {
        public static void main(String[] args) {
            String my_string = "programmers";
            List<String> list = new ArrayList<>();
            IntStream.range(0, my_string.length()).forEach(value -> {
                list.add(my_string.substring(value,my_string.length()));
                System.out.println(list);
            });
            String[] arr = list.stream().toArray(String[]::new);
            Arrays.sort(arr);
            System.out.println(Arrays.toString(arr));
        }
    }
    ---------------------------------------------------------------
    [programmers]
    [programmers, rogrammers]
    [programmers, rogrammers, ogrammers]
    [programmers, rogrammers, ogrammers, grammers]
    [programmers, rogrammers, ogrammers, grammers, rammers]
    [programmers, rogrammers, ogrammers, grammers, rammers, ammers]
    [programmers, rogrammers, ogrammers, grammers, rammers, ammers, mmers]
    [programmers, rogrammers, ogrammers, grammers, rammers, ammers, mmers, mers]
    [programmers, rogrammers, ogrammers, grammers, rammers, ammers, mmers, mers, ers]
    [programmers, rogrammers, ogrammers, grammers, rammers, ammers, mmers, mers, ers, rs]
    [programmers, rogrammers, ogrammers, grammers, rammers, ammers, mmers, mers, ers, rs, s]
    [ammers, ers, grammers, mers, mmers, ogrammers, programmers, rammers, rogrammers, rs, s]

    규칙이 보인다.