본문 바로가기
Beakjoon&프로그래머스/Java

[프로그래머스/Java] 튜플

by 현장 2026. 3. 27.

-Code

import java.util.*;

class Solution {
    public int[] solution(String s) {
        // 튜플들을 받을 리스트
        List<int[]> tuples = new ArrayList<>();
        // 튜플을 만들기 위한 스트링 빌더
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i < s.length() - 1; i++) {
            char now = s.charAt(i);
            // }일 경우 만들어진 튜플을 저장하고 sb 초기화
            if (now == '}') {
                String tupleStr = sb.toString();
                // 첫 튜플 말곤 ','가 포함되어 있으므로 ','제거
                if (tupleStr.startsWith(",")) tupleStr = tupleStr.substring(1);
                // 배열로 변경
                int[] tuple = Arrays.stream(tupleStr.split(","))
                        .mapToInt(Integer::parseInt).toArray();
                // 튜플 추가
                tuples.add(tuple);
                // sb 초기화
                sb.setLength(0);
            } else if (now != '{') {
                // 숫자와 ,를 저장
                sb.append(now);
            }
        }
        // 길이로 정렬
        tuples.sort((o1, o2) -> {
            return o1.length - o2.length;
        });
        // 순서를 포함해 저장하고 중복을 제거하기 위한 set
        Set<Integer> answer = new LinkedHashSet<>();
        for (int[] tuple : tuples) {
            for (int num : tuple) {
                answer.add(num);
            }
        }
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}

처음에 '}'가 나올 때 tuples에 저장하고 }가 아니면 저장을 하는 방식으로 하는 것은 맞았으나 이렇게 되면 2번째 튜플부터 ', '가 맨 앞에 포함이 되기 때문에 문제가 생겨서 해당 부분을 잘라내는 로직을 추가했습니다.

sb도 새로운 생성자로 재정의 했으나 메모리 문제가 생길거 같아 찾아보니 setLength(0)라는 것으로 강제로 길이를 잘라내는 식으로 메모리 사용도 줄일 수 있었습니다.

또한 answer도 list나 배열로 받으려 했으나 이 경우 포함 여부를 한 번 더 찾아내야 해서 Set 중 순서를 기억하는 LinkedHashSet을 사용해 해결했습니다.