[프로그래머스] 레벨2 튜플
https://programmers.co.kr/learn/courses/30/lessons/64065?language=java
코딩테스트 연습 - 튜플
"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]
programmers.co.kr
난이도에 비해 문제 설명이 엄청 길다. 이 튜플이라는 자료형은 자바에는 없고 예전에 파이썬을 잠깐할 때 다뤄봤던 기억이 난다. 어쨌든 정의상 제일 중요한 건 중복에 대한 허용이 가능하고, 순서에 영향을 받는다는 점이다.
그리고 문제해결을 위한 접근은 다음과 같다.
1. 입력받는 문자열 s를 전처리한다. (substring, replace, trim 등)
2. 원소를 구분할 수 있는 기호를 찾아 원소별로 나눠 배열에 저장한다.
3. 배열을 문자열의 길이로 오름차순 정렬한다.
4. 첫 번째 원소부터 차례대로 순회하며 결과를 출력한다.
4-1. 결과를 출력하기 위한 리스트를 만들고, 여기에 저장한다.
4-2. 단, 기존 리스트에 있지 않은 숫자만 저장한다.
문제
제한사항 및 입출력
코드
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
class Solution
{
public int[] solution(String s)
{
s = s.substring(2, s.length()-2); // {{}} 제거
s = s.replace("},{", "/"); // 원소 단위별 구분자 생성
s = s.trim(); // 공백 제거
// 구분자별 원소로 단어 나누기
String [] words = s.split("/");
// 단어 길이별 정렬
Arrays.sort(words, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
// 결과 출력용 리스트 생성
ArrayList<Integer> list = new ArrayList<>();
// 리스트에 원소넣기
for(int i=0; i<words.length; i++)
{
// 원소별 , 로 숫자 나누기
String[] compare = words[i].split(",");
for(int j=0; j<compare.length; j++)
{
int num = Integer.parseInt(compare[j]);
//리스트에 숫자가 없을 경우, 새로 추가
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;
}
}