[프로그래머스] 튜플

Choi Seong Jin·2022년 11월 20일

프로그래머스

목록 보기
14/33

문제 링크 : 튜플


내 풀이

처음 풀이

public ArrayList<Integer> solution(String s) {
	ArrayList<Integer> answer = new ArrayList<>();

    s = s.substring(2,s.length());
    s = s.substring(0,s.length() - 2);

    s = s.replace("},{", "/");

    String[] strs = s.split("/");

    Arrays.sort(strs, (String s1, String s2) -> s1.length() - s2.length());

    for(String str: strs){
        String[] temp = str.split(",");
        for(int i = 0; i < temp.length; i++){
            int num = Integer.parseInt(temp[i]);
            if(!answer.contains(num)){
                answer.add(num);
            }
        }
    }
    return answer;
}

기존에 반환형인 int[]형을 ArrayList로 바꿔서 푼 풀이다.
tuple의 길이가 동적으로 바뀌어서 그것을 어떻게 담아낼까 고민하다가 일단은 ArrayList로 풀었다.
앞뒤의 {{와 }}을 모두 잘라내고, 집합의 구분을 },{에서 /로 변경한다.
그 후 /를 기준으로 잘라서 집합을 담고있는 문자열을 생성한 후, 길이순으로 정렬한다.
그 후에 순차적으로 튜플을 담을 ArrayList에 삽입 후 반환한다.

두번째 풀이(실패)

public int[] solution(String s) {
        String[] ary = s.replaceAll("\\{", " ").replaceAll("\\}", " ").trim().split(" , ");
        Arrays.sort(ary, (String s1, String s2) -> s1.length() - s2.length());

        String[] answerAry = ary[ary.length - 1].split(",");

        int[] answer = new int[answerAry.length];
        int index = 0;

        for(String str: answerAry){
            answer[index++] = Integer.parseInt(str);
        }
        return answer;
    }

이 풀이부터 int[] 자료형으로 반환하기 위해서 노력을 했다.
문자열을 분리시키는 것은 다른 사람들의 풀이를 봤을 때 좋은 방법이 있어서 저것을 따랐다. 먼저 {와 }를 모두 공백 한칸으로 제거한 후, trim을 통해 앞, 뒤 공백을 제거한다. 그 다음 원래 "},{" 이 문자열이었을 것이 교체되어 " , " 된 것을 기준으로 split해서 집합을 구분지어 문자열 배열에 담는다.
그 후 배열의 길이순으로 정렬한다.
여기서 하나 실수했던 것이, 튜플의 배치가 다르면 다른 튜플이 된다는것을 까먹고 문제풀이를 진행해 가장 길이가 긴 것만을 검사해서 기대했던 기댓값과 다르게 나와 계속 문제가 틀렸다.
집합의 길이가 작은 것부터 진행해야 기댓값과 같은 튜플을 만들 수 있다는 것을 착안한 후 다시 풀이한 것이 다음의 풀이이다.

마지막 풀이

public int[] solution(String s) {
        Set<String> set = new HashSet<>();
        String[] ary = s.replaceAll("\\{", " ").replaceAll("\\}", " ").trim().split(" , ");
        Arrays.sort(ary, (String s1, String s2) -> s1.length() - s2.length());

        int[] answer = new int[ary.length];
        int index = 0;

        for(String str: ary){
            for(String str2: str.split(",")){
                if(set.add(str2)){
                    answer[index++] = Integer.parseInt(str2);
                }
            }

        }
        return answer;
    }
profile
백엔드 개발자 지망생입니다!

0개의 댓글