프로그래머스 튜플 Java - 2019 카카오 개발자 겨울 인턴십
문제
주어진 문자열을 튜플단위로 분리한 후에 튜플의 수가 작은 것부터 정렬하여 순서를 만드는 문제이다.
튜플 사이의 위치는 바뀔 수 있기에 {a1, a2} == {a2, a1} 하나의 튜플이 a2 가 먼저나오면 a2 -> a1 으로 반환하면 된다.
접근
- 주어진 문자열을 튜플 단위로 나눈다.
- 나누어진 튜플을 길이의 오름차순으로 정렬한다.
- 작은 값부터 중복되지 않도록 순서대로 정닫 리스트에 넣는다.
풀이
1번
s = s.substring(2, s.length()-2).replace("},{", "-");
String [] arr = s.split("-");
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
ArrayList<Integer> list = new ArrayList<>();
for(String temp : arr) {
String [] val = temp.split(",");
for(int i=0 ; i<val.length ; i++) {
int num = Integer.valueOf(val[i]);
if(!list.contains(num)) {
list.add(num);
}
}
}
int [] answer = new int[list.size()];
for(int i=0 ; i<list.size() ; i++) {
answer[i] = list.get(i);
}
return answer;
- 제일 앞과 끝의 두글자는 필요없으므로 substring()으로 잘라주고 튜플을 나누기 위해서 },{ -> - 로 변환
- 나누어진 튜플을 split을 이용해서 배열에 저장하고 길이의 오름차순으로 정렬한다.
- 길이에 따라 정렬된 값을 하나씩 가져와서 정수형으로 바꾸고 중복되지 않도록 리스트에 저장한다.
2번 Tokenizer 사용
StringTokenizer st = new StringTokenizer(s, "{}");
ArrayList<String> list = new ArrayList<>();
while(st.hasMoreTokens()) {
String temp = st.nextToken();
if(!temp.equals(","))
list.add(temp);
}
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
ArrayList<String> answerList = new ArrayList<>();
for(String temp : list) {
String [] arr = temp.split(",");
for(int i=0 ; i<arr.length ; i++) {
if(!answerList.contains(arr[i])) {
answerList.add(arr[i]);
}
}
}
int [] answer = new int[answerList.size()];
for(int i=0 ; i<answerList.size() ; i++) {
answer[i] = Integer.parseInt(answerList.get(i));
}
return answer;
- tokenizer를 사용하여 {} 단위로 튜플을 나누고 그 과정에서 “\,” 는 제외한 나머지 값들을 리스트에 저장한다.
- 리스트에 저장한 스트링 값들을 길이의 오름차순으로 정렬한다.
- 길이에 따라 정렬된 값을 하나씩 가져와서 정수형으로 바꾸고 중복되지 않도록 리스트에 저장한다.
이 문제는 문자열을 적절한 형태로 변환하여 우너하는 값을 도출할 수 있는지를 물어보는 문제이다. split(), tokenizer()의 사용법을 익혀서 활용할 수 있어야 하고 정렬 방식을 오버라이딩하여 원하는 방식으로 기능을 확장하여 사용할 수 있어야 한다.
결론
- splite() & tokenizer() 문자열 분할
- Arrays.sort(자료구조, new Comparator<>()) 기존의 정렬과 다른 방식으로 오버로딩할 때 사용