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