공부 일지/문제풀이

[프로그래머스] 튜플(JAVA)

Joshbla 2023. 3. 2. 01:10

2019 카카오 개발자 겨울 인턴십 - 튜플

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

"{{2},{2,1},{2,1,3},{2,1,3,4}}" 와 같은 문자열이 주어졌을 때

배열의 갯수가 낮은 배열부터 새롭게 추가된 숫자를 배열에 담아 리턴한다.

위의 예시의 답은 {2,1,3,4} 이다.

"{{1,2,3},{2,1},{1,2,4,3},{2}}"  ->  {2, 1, 3, 4}

"{{20,111},{111}}"  ->  {111, 20}


문제 풀이

생각 과정

스트링 문제이고 StringTokenizer와 replace를 적절히 이용하면 충분히 풀 수 있을 것이라 생각했다.

 

문제풀이를 마치고 다른 사람들의 풀이를 보니 중복을 제거하는 과정에서 Set을 사용할 수 있었고

replace 메서드도 더 깔끔하게 사용할 수 있었는데 아쉬웠다.

구현

public class 카카오2019겨울인턴십_튜플 {
    public static void main(String[] args) {
        String s = "{{4,2,3},{3},{2,3,4,1},{2,3}}";
        System.out.println(Arrays.toString(solution(s)));
    }
    public static int[] solution(String s) {
        int[] answer = {};
        // {4,2,3},{3},{2,3,4,1},{2,3}
        s = s.substring(1, s.length() - 1);
        int n = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '{') {
                n++;
            }
        }
        List<Integer>[] lists = new List[n];
        answer = new int[n];
        StringTokenizer st = new StringTokenizer(s, "}");
        // {4,2,3
        // ,{3
        // ,{2,3,4,1
        // ,{2,3
        while (st.hasMoreTokens()) {
            String str = st.nextToken();
            str = str.replace("{", "");
            // 4,2,3
            // ,3
            // ,2,3,4,1
            // ,2,3
            str = str.replace(",", " ");
            // 4 2 3
            //  3
            //  2 3 4 1
            //  2 3
            String[] a = str.split(" ");
            ArrayList<Integer> list = new ArrayList<>();
            for (int i = 0; i < a.length; i++) {
                if (a[i].equals("")) continue;
                list.add(Integer.parseInt(a[i]));
            }
            lists[list.size()-1] = list;
        }
        for (int i = lists.length-1; i >0 ; i--) {
            for (int j = 0; j < lists[i-1].size(); j++) {
                lists[i].remove(lists[i - 1].get(j));
            }
        }
        for (int i = 0; i < lists.length; i++) {
            answer[i] = lists[i].get(0);
        }
        return answer;
    }
}

 

주의점

// 4,2,3
// ,3
// ,2,3,4,1
// ,2,3
str = str.replace(",", " ");
// 4 2 3
//  3
//  2 3 4 1
//  2 3
String[] a = str.split(" ");
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
    if (a[i].equals("")) continue;
    list.add(Integer.parseInt(a[i]));
}

 

" 2 3 4 1"처럼 가장 앞이나 뒤에 공백이 있는 문자열을 split으로 나누면

{"", "2", "3", "4", "1"} 의 문자열 배열이 생기게된다.

따라서 Integer.parseInt로 변환하기 전에 ""인 경우에 continue를 해줄 필요가 있다.