[JAVA/프로그래머스] 2019 카카오 개발자 겨울 인턴십: 튜플

👀 문제

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

👊 도전

1. 설계

  1. s안의 중괄호를 없애서 배열에 넣는다.
  2. 원소 길이의 오름차순으로 정렬한다.
  3. 정렬된 String 원소를 순회한다.
  4. 각 원소에서 ‘,’를 지우고 숫자만 남긴 후, 처음 보는 숫자이면 answer에 넣는다.
  5. 숫자 체크는 HashSet을 이용한다.

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.*;
/**
 *
 * @author HEESOO
 *
 */
class Solution {
    public int[] solution(String s) {
        int[] answer = {};
        // 중괄호 없애기
        s=s.substring(1,s.length()-1);
        s=s.replaceAll("},|}", "");
        s=s.substring(1,s.length());
        String[] str=s.split("\\{");
        // 길이 순으로 오름차순 정렬
        Arrays.sort(str, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2){
                if(s1.length()<s2.length()) return -1;
                else if(s1.length()==s2.length()) return 0;
                else return 1;
            }
        });
        
        int n=str.length;
        answer=new int[n];        
        HashSet<String> map=new HashSet<>(); // 숫자 체크 위함
        for(int i=0;i<n;i++){ // 집합 순회
            String[] now=str[i].split(","); // 숫자만 남기기
            for(int j=0;j<now.length;j++){ // 숫자 순회
                if(map.contains(now[j])) continue; 
                else { // 처음 보는 숫자이면 answer에 삽입
                    answer[i]=Integer.parseInt(now[j]);
                    map.add(now[j]); // 다음 비교를 위함
                    break;
                }
            }
        }
        return answer;
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 문자열을 쪼갠다
    • 집합을 감싸는 ‘{}’를 없앤다.
    • 집합이 끝나는 지점인 ‘},’과 맨 마지막 끝 ‘}’를 없앤다.
    • 처음 시작하는 중괄호 ‘{‘를 업앤다.
    • ’{‘ 기준으로 s를 쪼개서 배열에 저장한다.
    • 이제 배열에는 숫자와 콤마만 들어가있다. ex) [“1,2”, “3”, …]
    • 길이가 짧은 것부터 체크해야하므로 Comparator을 이용하여 길이순으로 오름차순 정렬한다.
  2. 해시셋을 이용하여 숫자를 체크한다
    • 오름차순 정렬된 str을 인덱스 i로 순회한다.
    • i번째 문자열의 숫자만 체크하기 위해 ‘,’ 기준으로 잘라 now 배열에 넣는다.
    • now를 인덱스 j로 순회하며 now 집합 안의 숫자를 체크한다.
    • HashSet을 이용하여 처음 보는 숫자이면 answer에 넣는다.
    • 숫자는 중복이 없다고 했으므로 해시셋을 사용할 수 있다.
    • 다음 비교를 위해 answer[i]에 넣은 값을 해시셋에도 저장해준다.

👏 해결 완료!