본문 바로가기
Algorithm/programmers

2019 카카오 개발자 겨울 인턴쉽 - 튜플(문자열 파싱, 구현 ) - Java 풀이

by Ellery 2022. 3. 28.

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

 

코딩테스트 연습 - 튜플

"{{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] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

- 변수 제한사항 범위가 좁아서 딱히 복잡도 걱정을 안하고 푼 문제이다. 
실무에서도 JSON 파싱 등을 할 때 종종 쓸만한 방법인 것 같다. },{ 단위로 쪼개는 String.split(String regex) 함수를 쓰려고 정규표현식을 한번 복습했다. 정규표현식에서 중괄호가 앞 문자의 반복을 나타내는 특수문자로 쓰일 수 있어서 백슬래시 2개로 escape 처리를 해줘야한다. 

- 파싱된 int 배열들을 배열 길이 오름차순으로 정렬해서 맨 앞 원소부터 조회하면서 없는 숫자를 담아주면 된다. 

 

import java.util.*;

class Solution {
    public int[] solution(String s) { // s 100만
        List<List<String>> a = new ArrayList<>();
        
        String[] strArr = s.substring(2, s.length() - 2).split("\\},\\{");
        for(int i = 0; i < strArr.length; ++i) {
            String[] substr = strArr[i].split(",");
            a.add(Arrays.asList(substr));
        }
        
        Collections.sort(a, (fi, se) -> fi.size() - se.size());
        
        Set<Integer> ans = new LinkedHashSet<>();
        for(int i = 0; i < a.size(); ++i) {
            for(int j = 0; j < a.get(i).size(); ++j) {
                int num = Integer.parseInt(a.get(i).get(j));
                if(!ans.contains(num)) ans.add(num);
            }
        }
        
        return ans.stream().mapToInt(Integer::intValue).toArray();
    }
}