본문 바로가기

개발지/코테

[프로그래머스] 코테연습 - 튜플(lv.2)

- 내 방법 풀이 (https://deokkk9.tistory.com/48)

  • 문제를 이해하는 것부터 어려웠고, 질문하기에서 힌트를 얻었지만, 결국 다른 사람의 풀이를 참고하게 되었다.
  • HashMap을 사용하여, 튜플배열에 등장하는 a1부터 an까지 구해 answer배열에 넣어주려고 했지만, Hashmap에서 value 기준으로 key를 정렬 할 때 오류가 낫고, 문자열 다루는 것이 매끄럽게 되지 않았다.
  • 스트림과 람다식에 익숙해질 필요를 느꼈다. 잘 다룰수록, 필요한 부분에서 깔끔한 코드를 가져올 수 있는거 같다. 
import java.util.*;

class Solution {
    public int[] solution(String s) {
        int[] answer = {};
        s = s.replaceAll("[\\{,\\}]", " "); // "{" "," "}" 제거
        String[] sa = s.split("[ ]+"); // 하나 이상의 공백(+정규식)을 기준으로 문자열 나누기.
        Map<String, Integer> hashMap = new HashMap<>(); // 숫자 출현 빈도 저장을 위한 hashmap

        for(int i = 0; i < sa.length; i++){ 
            if (!sa[i].equals("")){ // 공백이 아닐 경우.
                if (hashMap.containsKey(sa[i])){ // 해당 숫자의 빈도 저장
                    hashMap.replace(sa[i], hashMap.get(sa[i]) + 1);
                }else{
                    hashMap.put(sa[i], 1); 
                }
            }
        }

        List<Map.Entry<String, Integer>> list = new ArrayList<>(hashMap.entrySet()); // hashMap to List
        // 출력하면 list: [String = Integer, String=Integer, String=Integer] 식으로나옴.
        Collections.sort(list, (o1, o2) -> {return o2.getValue().compareTo(o1.getValue());}); // 빈도에 따라 숫자 정렬.

        answer = new int[list.size()]; // answer 배열 생성.

        for(int i = 0; i < answer.length; i++){
            answer[i] = Integer.parseInt(list.get(i).getKey());
        }

        return answer;
    }
}

 

- 다른 사람 방법 풀이

  • Set을 활용하여 푼 풀이. 문자열을 배열로 만드는 것까지는 비슷하다.
  • 배열 내에서 문자열이 짧은 요소(길이를 기준으로  오름차순)대로 정렬한다.
  • 튜플배열을 순회하면서, set.add가 true라면(set.add의 리턴값은 boolean이다.)  새로 등장한 요소, 즉 n-튜플의 an요소이므로 answer에 추가해준다.
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;
    }
}