devFancy BE Developer

[Programmers] 64065. 튜플

2023-02-10
devfancy

문제 링크

성능 요약

  • 메모리: 76.2 MB, 시간: 0.38 ms - Answer Code1(2022.02.10)

  • 메모리: 75.2 MB, 시간: 0.69 ms - Answer Code2(2022.02.10)

구분

  • 코딩테스트 연습 > 2019 카카오 개발자 겨울 인턴십

Answer Code1(2022.02.10)

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Arrays;

class Solution {
    public ArrayList<Integer> solution(String s) {
    
        ArrayList<Integer> answer = new ArrayList<>();
        
        s = s.substring(2, s.length());
        s = s.substring(0, s.length() -2).replace("},{", "-");
        
        String str[] = s.split("-");
        Arrays.sort(str, new Comparator<String>() {
            public int compare(String s1, String s2) {

                return s1.length() - s2.length();  // return Integer.compare(o1.length(), o2.length());
            }
        });
 
        for(String x : str) {
            String [] temp = x.split(",");
            
            for(int i = 0; i < temp.length; i++) {
                
                int n = Integer.parseInt(temp[i]);
                
                if(!answer.contains(n)) {
                    answer.add(n);
                }
            }
        }
        
        return answer;
    }
}

문제 풀이

  • 튜플을 만들 ArrayList 객체를 선언하고, 가장 앞에 있는 {{ 부분과 가장 뒤에 있는 }} 부분을 제거한다. => substring() 메서드를 사용하여 제거한다.

  • {,} 형태의 문자열을 -으로 바꾼다. => replace("},{", "-")'

  • 위에서 바꾼 문자열 - 을 기준으로 구분해준다. => .split("-");

  • 원소들의 길이를 기준으로 정렬한 뒤 가장 짧은 원소부터 고려하며 튜플을 채워나간다.

    • 예) "{{2},{2,1},{2,1,3},{2,1,3,4}}" 인 경우 가장 짧은 원소인 {2}부터 시작해서 채워나간다.

    • java.util.Arrays 유틸리티 클래스를 사용하여 Arrays.sort() 메서드를 통해 오름차순 정렬을 해준다.

    • 원하는 정렬 조건을 만들기 위해서는 import java.util.Comparator 클래스내 compare() 메서드를 사용한다.

    • 반복문을 이용하여 , 을 기준으로 구분(split(","))하여 새로운 문자열 배열을 만든다.

    • 그리고 안에 반복문을 이용하여 각 문자열 값을 정수로 바꾼다. => Integer.parseInt();

    • 튜플에 들어있는 값이 아니라면 추가한다. => .contains(), .add()

Answer Code2(2022.02.10)

import java.util.*;
class Solution {
    public int[] solution(String s) {
        Set<String> set = new HashSet<>();
        String[] arr = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , ");
        Arrays.sort(arr, (a, b)->{return a.length() - b.length();});
        int[] answer = new int[arr.length];
        int idx = 0;
        for(String s1 : arr) {
            for(String s2 : s1.split(",")) {
                if(set.add(s2)) answer[idx++] = Integer.parseInt(s2);
            }
        }
        return answer;
    }
}

Review

  • 첫 번째 풀이 :해당 문자열을 구분하기 위해 필요한 부분들을 제거한 뒤, 나만의 기준으로(-) 문자열을 구분해주는 것에 대한 아이디어를 쉽게 떠올리지 못했다.

    • 그리고 나눠진 문자열 배열을 오름차순으로 정렬하는 것은 알겠는데, 코드로 구현하는 것을 몰라서 구글링을 하게 됐다.

    • 아직은 문제를 많이 풀지 못했기 때문에 알고리즘 구현 실력이 제대로 갖추지 못했지만, 꾸준히 하다보면 성장하는 날이 올거라 생각한다.

    • 해당 문제는 1주일 내로 다시 풀어보자.

  • 두 번째 풀이는 가장 많은 좋아요 수를 받은 풀이 방법이다.

    • replaceAll() 메서드랑 Set 인터페이스를 구현한 가장 대표적인 컬렉션인 HashSet 를 이용한 것도 기억해두자.

Reference


Comments

Index