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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

푸는데 40분정도 걸린것같습니다.

 

이번문제는 여러 함수들을 새로 많이 배웠습니다.

 

기억해야할점

-String 배열을 배열 원소의 길이, 개수에 따라 오름차순 정렬하는 함수.

  • {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}} 이 주어졌다고 생각해봅니다.

이문제를 분석해보면 {2}, {2,1}, {2,1,3}, {2,1,3,4} 이런식으로 새로운 숫자가 추가될때마다 배열 크기도 커집니다.

이를 위하여 위의 배열의 개수에 따라 배열을 우선 정렬해야합니다. 그에 관한 손쉬운 함수들입니다.

Arrays.sort(s_split_temp, new Comparator<String>(){
    @Override
    public int compare(String s1, String s2){
        return s1.length() - s2.length();
    }
});

위의 식을 람다화

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

 

-String replaceAll 사용방법 (아래 두가지 다 가능)

str = str.replaceAll("\\{|\\}","");
str = str.replaceAll("\\{","").replaceAll("\\}","");

 

-새로운 숫자가 추가될때마다 배열에 추가되는 것을 어떤식으로 생각해야하는가.

answerArr을 선언합니다.

 

이번에 {2} 를 처리해야할떄라고 생각합니다. 

{2}를 돌면서 answerArr에 해당 값이 있다면 flag = true로 바꾸어 넣지 않습니다. 없다면 다 돈뒤 flag = false인 상태이므로 answerArr.add(2);

{2,4}를 돌면서 answerArr에는 2는 존재하니 flag = true, 4는 answerArr 입장에서 처음보는 숫자이니 flag = false인 상태이므로 answerArr.add(4);

를합니다.

 

 

-이문제를 풀수 있는 다른방법으로 HashSet이 있습니다. 그냥 조금 처리를 빠르게 해주는것.

만약 해당 값을 넣었는데 이미 존재하는 값이라면 hashset.add() 했을떄 return 값이 false 이 나옵니다. 

그러면 그값은 처리안하고, return 값이 true 라면 answerArr에 넣습니다.

 

내가 푼방식을 극도로 효율화한 사람. (참고할코드)

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;
    }
}

 

 

 

내가 푼 코드

class Solution {
    int[] answer = {};
    
    ArrayList<Integer> arr = new ArrayList<Integer>();
    String[] s_arr;
    
    public int[] solution(String s) {
        String[] s_split_temp = s.substring(1, s.length()-1).split("},");
        
        //String 배열의 각각값들을 길이가 짧은 순서부터 출력하기 위해 오름차순 정렬
        Arrays.sort(s_split_temp, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2){
                return s1.length() - s2.length();
            }
        });
        
        // Arrays.sort(s_split_temp, (String s1, String s2) -> s1.length() - s2.length());
        
        for(int i=0;i<s_split_temp.length;i++){
            String str = s_split_temp[i];
            // str = str.replaceAll("\\{|\\}","");
            str = str.replaceAll("\\{","").replaceAll("\\}","");
            
            s_arr = str.split(",");
            
            for(int j=0;j<s_arr.length;j++){
                int a = Integer.parseInt(s_arr[j]);
                boolean flag = false;
                for(int k=0;k<arr.size();k++){
                    if(a == arr.get(k)){
                        flag = true;
                    }
                }
                
                if(flag == false){
                    arr.add(a);
                }
            }
            
        }
        
        answer = new int[arr.size()];
        for(int i=0;i<arr.size();i++){
            answer[i] = arr.get(i);
        }
        return answer;
    }
    

}

 

+ Recent posts