-
[프로그래머스/JAVA] 튜플 (2019 카카오 개발자 겨울 인턴십 문제)Algorithm/Java 2025. 1. 28. 17:06
https://school.programmers.co.kr/learn/courses/30/lessons/64065
[ 오답 노트 ]
❌ 기존 오답 코드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(); } }
반응형'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/JAVA] [1차] 캐시 (2018 KAKAO BLIND RECRUITMENT 문제) (1) 2025.01.27 [프로그래머스/JAVA] 2016년 (1) 2025.01.27 [프로그래머스/JAVA] H-Index (0) 2025.01.24 [프로그래머스/JAVA] 행렬의 곱셈 (0) 2025.01.23 [프로그래머스/JAVA] n^2 배열 자르기 (0) 2025.01.23