ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스/JAVA] 튜플 (2019 카카오 개발자 겨울 인턴십 문제)
    Algorithm/Java 2025. 1. 28. 17:06

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

     

    프로그래머스

    SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr

     



    [ 오답 노트 ]

    ❌ 기존 오답 코드

    import java.util.*;
    
    class Solution {
        public int[] solution(String s) {
            List<Integer> answer = new ArrayList<>();
            // {{2},{2,1},{2,1,3},{2,1,3,4}}
            // 위에서 제일 첫번째 문자 이후 ~ 제일 마지막 문자 이전까지의 문자열만
            // {2},{2,1},{2,1,3},{2,1,3,4}
            // , 기준으로 나눠서 집어넣기 
            // [2], [2,1], [2,1,3], [2,1,3,4]
            // 중복되는 수 제외하고 answer에 수 집어넣기
            // [2,1,3,4]
            
            HashSet<Integer> hs = new HashSet<>();
            StringBuilder ss = new StringBuilder();
            for(int i = 2; i < s.length() - 2; i++) {
                // 2},{2,1},{2,1,3},{2,1,3,4
                ss.append(s.charAt(i));
            }
            
            // },{ 기준으로 나눠서 집어넣기 
            String[][] str = ss.split("},{"); // [[2], [2,1], [2,1,3], [2,1,3,4]]
            
            // 중복되는 수 제외하고 hs에 수 집어넣기
            for(int j = 0; j < str.length; j++) {
                for(int x = j; x < str[j].length; x++) {
                    hs.add(str[i][j]);
                }
            }
            
            // answer에 hs 요소 다 집어넣기 
            for(int z : hs) {
                answer.add(z);
            }
            
            return answer;
        }
    }



    📌 기존 코드의 문제점

     

    1. 입력 문자열에서 양 끝의 중괄호 제거 후, "},{" 기준으로 분리하는 부분 코드 수정

    • 기존 코드에서는 StringBuilder를 사용했으나 제대로 처리되지 않으며 split 과정에서도 오류가 발생한다. 
    • 문자열은 단순히 substring을 사용해 잘나내고, split으로 처리하는 방식이 적합하다. (아래 코드 참고)
     String[] str = s.substring(2, s.length() - 2).split("\\},\\{");
     // str = ["2", "2,1", "2,1,3", "2,1,3,4"];

     

     

    2. 정렬 코드 추가 

    • HashSet만 사용하면 중복 제거는 가능하나 순서는 보장할 수 없다. 
    • 위 문제의 조건인 "셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다." 에 따라 정렬없이 단순히 숫자만 추가하면 안된다. 
    // 길이를 기준으로 오름차순 정렬
    Arrays.sort(str, (a,b) -> a.length() - b.length());
    // str = ["2", "2,1", "2,1,3", "2,1,3,4"];

     

     

    3. 해시맵에 원소 추가하는 로직 코드 수정

            // 중복되는 수 제외하고 answer에 수 집어넣기
            for(String group : str) {
                String[] numbers = group.split(",");
                // numbers = ["2"];
                // numbers = ["2", "1"];
                // numbers = ["2", "1", "3"];
                // numbers = ["2", "1", "3", "4"];
                for(String num : numbers) {
                    int value = Integer.parseInt(num);
                    if(hs.add(value)) { // 중복체크 
                        answer.add(value);
                    }
                }
            }

     

     

    3. ArrayList를 배열로 변환하여 반환하는 부분 코드 추가 

    return answer.stream().mapToInt(i->i).toArray();

     



    [ 정답 코드 ]

     

    📌 정답 코드

    import java.util.*;
    
    class Solution {
        public int[] solution(String s) {
            List<Integer> answer = new ArrayList<>();
            HashSet<Integer> hs = new HashSet<>();
            
            // 2},{2,1},{2,1,3},{2,1,3,4 형태로 자르고, },{ 기준으로 나눠서 집어넣기 
            // 중괄호 포함시 이를 문자 그대로 인식시키려면, 아래처럼 이스케이프 처리(\\)가 필요
            String[] str = s.substring(2, s.length() - 2).split("\\},\\{");
            // str = ["2", "2,1", "2,1,3", "2,1,3,4"];
            
            // 길이를 기준으로 오름차순 정렬 
            Arrays.sort(str, (a, b) -> (a.length() - b.length()));
            // str = ["2", "2,1", "2,1,3", "2,1,3,4"];
            
            // 중복되는 수 제외하고 answer에 수 집어넣기
            for(String group : str) {
                String[] numbers = group.split(",");
                for(String num : numbers) {
                // numbers = ["2"];
                // numbers = ["2", "1"];
                // numbers = ["2", "1", "3"];
                // numbers = ["2", "1", "3", "4"];
                    int value = Integer.parseInt(num);
                    if(hs.add(value)) {
                        answer.add(value);
                    }
                }
            }
              
            // 리스트 -> 배열로 전환 후 반환
            return answer.stream().mapToInt(i->i).toArray();
        }
    }
    반응형
Designed by Tistory.