프로그래머스 - 튜플(카카오 기출) (java)

Mendel·2024년 3월 21일

알고리즘

목록 보기
39/85

문제 접근

이 문제는 그냥 문자열을 어떻게 끊어서 빠른시간안에 문제를 해결할거냐가 관건이였던 것 같다. 시험때 만나면쉬운데 시간 잡아먹을 것 같은 문제였다.
숫자는 최대 500개이므로 어차피 N^2으로 답을 구해도 충분하다.
그러므로 그냥 잘 끊어읽어서 집합 사이즈별로 구분만 잘하면 된다.

이 과정에서 split과 StringTokenizer의 차이에 대해 알게되었다. 두 글자 이상의 구분자가 필요하다면 split을 쓰자.
그리고, 한글자씩 다양한 종류의 구분자가 필요하다면 StringTokenizer를 쓰면 좋다.
이 외에도 StringTokenizer의 hasMoreNext() 이름 헷갈리지말자.
그리고 String.substring(s, e)인데 substring이거 카멜케이스 아니다... 자꾸 실수했다.

문제 풀이

import java.io.*;
import java.util.*;

class Solution {
    public int[] solution(String s) {
        int[] answer = {};
        String[] strs = s.split("},");
        if (strs.length == 1) {
            ArrayList<Integer> arr = new ArrayList();
            String tmpS = s.substring(2, s.length());
            StringTokenizer st = new StringTokenizer(tmpS.substring(0, tmpS.length()-2), ",");
            while(st.hasMoreTokens()) {
                int tmpInt = Integer.parseInt(st.nextToken());
                System.out.println(tmpInt);
                arr.add(tmpInt);
            }
            int[] tmpArr = new int[arr.size()];
            for(int i=0; i<arr.size(); i++) {
                tmpArr[i] = arr.get(i);
            }
            return tmpArr;
        }
    
        ArrayList<Integer>[] arrs = new ArrayList[501];
        int N=0;
        for(int i=0; i<strs.length; i++) {
            if(i==0) {
                ArrayList<Integer> arr = new ArrayList();
                StringTokenizer st = new StringTokenizer(strs[i].substring(2, strs[i].length()), ",");
                while(st.hasMoreTokens()) {
                    arr.add(Integer.parseInt(st.nextToken()));
                }
                arrs[arr.size()] = arr;
                N = Math.max(N, arr.size());
            } else if (i==strs.length-1) {
                ArrayList<Integer> arr = new ArrayList();
                String tmpS = strs[i].substring(1, strs[i].length());
                StringTokenizer st = new StringTokenizer(tmpS.substring(0, tmpS.length()-2), ",");
                while(st.hasMoreTokens()) {
                    arr.add(Integer.parseInt(st.nextToken()));
                }
                arrs[arr.size()] = arr;        
                N = Math.max(N, arr.size());                
            } else {
                ArrayList<Integer> arr = new ArrayList();
                String tmpS = strs[i].substring(1, strs[i].length());
                StringTokenizer st = new StringTokenizer(tmpS, ",");
                while(st.hasMoreTokens()) {
                    arr.add(Integer.parseInt(st.nextToken()));
                }
                arrs[arr.size()] = arr;               
                N = Math.max(N, arr.size());                
            }
        }
        
        boolean[] isVisited = new boolean[10_0001];
        answer = new int[N];
        for(int i=1; i<=N; i++) {
            for(int j=0; j<arrs[i].size(); j++) {
                int tmpInt = arrs[i].get(j);
                if (!isVisited[tmpInt]) {
                    isVisited[tmpInt] = true;
                    answer[i-1] = tmpInt;
                    break;
                }
            }
        }

        return answer;
    }
}
profile
이것저것(안드로이드, 백엔드, AI, 인프라 등) 공부합니다

0개의 댓글