본문 바로가기

알고리즘

프로그래머스 - 튜플(2019 카카오 개발자 겨울 인턴십)`

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

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

문제를 풀기 전 정확하게 문제 풀이를 이해하고 푸는 것이 중요하다는 것을 다시 한번 깨달았습니다.

그냥 튜플에 입력된 순서대로 받아서 배열에 입력한 후 리턴하면 되는 줄 알았는데 그게 아니라 배열의 크기가 작은 순부터 탐색해야 했습니다.

틀린 풀이

class Solution {
        public int[] solution(String s) {

            char[] chars = s.toCharArray();

            LinkedHashMap linkedHashMap = new LinkedHashMap<>();

            for(int i=0; i<chars.length; i++){
                if(chars[i] == '{' || chars[i] == '}'){
                    chars[i] = ',';
                }
            }
            String str = String.valueOf(chars);
            String[] strArr = str.split(",");

            ArrayList<Integer> arr = new ArrayList<>();

            for(int i=0; i<strArr.length; i++){
                if(strArr[i].equals(""))
                    continue;
                linkedHashMap.put(strArr[i],1);
            }

            int[] answer = new int[linkedHashMap.size()];
            int cnt =0;
            for(Object key : linkedHashMap.keySet()){
                answer[cnt] = Integer.parseInt(String.valueOf(key));
                cnt++;
            }


            return answer;
        }
    }

정답 풀이

1. substring을 활용해 첫 intput 문자의 { }을 제거해줍니다.

2. 첫 번째 반복문에서 TreeMap을 활용해 튜플을 TreeMap에 삽입하는데 { }는 제거하여 삽입합니다.
TreeMap을 사용한 이유는 TreeMap의 경우 key 값을 기준으로 정렬하여 keySet을 얻을 수 있기 때문에 key 값으로 문자열의 길이를 넣어주어 튜플의 순서를 정렬하였습니다.

3. TreeMap에서 정렬된 튜플을 순서대로 얻으며 split을 통해 튜플의 원소를 얻습니다.

4. LiknedHashMap에 3번에서 얻은 튜플의 원소를 넣어줍니다. LinkedHashMap을 사용한 이유는 LinkedHashMap은 HashMap에 넣은 순서대로 keySet을 얻을 수 있기 때문에 순서를 보장할 수 있습니다.

5. int[] 배열을 선언하여 linkedHashMap에서 나온 key 값을 순서대로 배열에 담고 이 배열을 return 합니다.

import java.util.LinkedHashMap;
import java.util.TreeMap;
class Solution {
        public int[] solution(String s) {

            TreeMap<Integer, String> treeMap = new TreeMap();
            LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap();

            s = s.substring(1, s.length()-1);
            int leftIdx=0;
            int rightIdx=0;
            boolean flag = false;
            String temp;
            for(int i=0; i<s.length(); i++){
                if(s.charAt(i) == '{')
                    leftIdx = i;
                if(s.charAt(i) == '}'){
                    rightIdx = i;
                    flag = true;
                }
                if(flag) {
                    temp = s.substring(leftIdx+1, rightIdx);
                    flag = false;
                    treeMap.put(temp.length(), temp);
                }
            }

            for(Object key : treeMap.keySet()){
                String str = treeMap.get(key);
                String[] strArr = str.split(",");
                for(int i=0; i<strArr.length; i++){
                    linkedHashMap.put(strArr[i], 1);
                }
            }

            int[] answer = new int[linkedHashMap.size()];
            int cnt = 0;
            for(String key : linkedHashMap.keySet()){
                answer[cnt] = Integer.parseInt(key);
                cnt++;
            }

            return answer;
        }
    }

중구난방으로 풀었는데 아쉽습니다. 다른 분들의 풀이를 보았는데 정말 간단하게 풀었더라고요..

이 문제를 풀면서 TreeMap, LinkedHashMap 자료구조의 특징에 대해서 알 수 있었으니까 만족하고 다음에는 더 짧고 간단하게 풀어보는 걸 도전해야겠습니다 ㅎㅎ