공부 일지/문제풀이
[프로그래머스] 튜플(JAVA)
Joshbla
2023. 3. 2. 01:10
2019 카카오 개발자 겨울 인턴십 - 튜플
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/64065
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
"{{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}
"{{20,111},{111}}" -> {111, 20}
문제 풀이
생각 과정
스트링 문제이고 StringTokenizer와 replace를 적절히 이용하면 충분히 풀 수 있을 것이라 생각했다.
문제풀이를 마치고 다른 사람들의 풀이를 보니 중복을 제거하는 과정에서 Set을 사용할 수 있었고
replace 메서드도 더 깔끔하게 사용할 수 있었는데 아쉬웠다.
구현
public class 카카오2019겨울인턴십_튜플 {
public static void main(String[] args) {
String s = "{{4,2,3},{3},{2,3,4,1},{2,3}}";
System.out.println(Arrays.toString(solution(s)));
}
public static int[] solution(String s) {
int[] answer = {};
// {4,2,3},{3},{2,3,4,1},{2,3}
s = s.substring(1, s.length() - 1);
int n = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '{') {
n++;
}
}
List<Integer>[] lists = new List[n];
answer = new int[n];
StringTokenizer st = new StringTokenizer(s, "}");
// {4,2,3
// ,{3
// ,{2,3,4,1
// ,{2,3
while (st.hasMoreTokens()) {
String str = st.nextToken();
str = str.replace("{", "");
// 4,2,3
// ,3
// ,2,3,4,1
// ,2,3
str = str.replace(",", " ");
// 4 2 3
// 3
// 2 3 4 1
// 2 3
String[] a = str.split(" ");
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
if (a[i].equals("")) continue;
list.add(Integer.parseInt(a[i]));
}
lists[list.size()-1] = list;
}
for (int i = lists.length-1; i >0 ; i--) {
for (int j = 0; j < lists[i-1].size(); j++) {
lists[i].remove(lists[i - 1].get(j));
}
}
for (int i = 0; i < lists.length; i++) {
answer[i] = lists[i].get(0);
}
return answer;
}
}
주의점
// 4,2,3
// ,3
// ,2,3,4,1
// ,2,3
str = str.replace(",", " ");
// 4 2 3
// 3
// 2 3 4 1
// 2 3
String[] a = str.split(" ");
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
if (a[i].equals("")) continue;
list.add(Integer.parseInt(a[i]));
}
" 2 3 4 1"처럼 가장 앞이나 뒤에 공백이 있는 문자열을 split으로 나누면
{"", "2", "3", "4", "1"} 의 문자열 배열이 생기게된다.
따라서 Integer.parseInt로 변환하기 전에 ""인 경우에 continue를 해줄 필요가 있다.