15日目


プログラマ


質問:チュートリアル


プログラマーは二級問題をやり直した.
説明のためにParserというクラスが作成されました.
そしてstream演算を使用しました.
質問の説明は次のリンクです.
https://programmers.co.kr/learn/courses/30/lessons/64065?language=java

に答える


使用言語しようげんご:java java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;

class Solution {
    
    public static List<Integer> solution(String s) {
        Parser parser = new Parser(s, new ArrayList<>());
        parser.parseTuple();
        return parser.getTuple();
    }

    public static class Parser {
        private String pattern;
        private List<Integer> tuple;

        public Parser(String pattern, List<Integer> tuple) {
            this.pattern = pattern;
            this.tuple = tuple;
        }

        public List<Integer> getTuple() {
            return tuple;
        }

        public void parseTuple() {
            if (Objects.isNull(pattern)) {
                throw new IllegalArgumentException("pattern is required");
            }

            if (Objects.isNull(tuple)) {
                throw new IllegalArgumentException("tuple is required");
            }

            String s = pattern.substring(1, pattern.length() - 1); // 양 끝 괄호를 벗김

            final String[] splitResults = s.split("},\\{");
            Arrays.stream(splitResults)
                    .map(this::replaceBracketAndComma)
                    .sorted(Comparator.comparing(String::length))
                    .forEach(this::addTuple);
        }

        private String replaceBracketAndComma(String s) {
            return s
                    .replaceAll("}", "")
                    .replaceAll("\\{", "");
        }

        private void addTuple(String str) {
            final String[] chars = str.split(",");
            for (String s : chars) {
                if (!tuple.contains(Integer.parseInt(s))) {
                    tuple.add(Integer.parseInt(s));
                }
            }
        }
    }
}