Algorithm/Java

[프로그래머스/JAVA] 튜플 (2019 카카오 개발자 겨울 인턴십 문제)

dbfl9911 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();
    }
}
반응형