Algorithm, kakao, 튜플

튜플

풀이

1. 괄호안의 숫자들을 뽑는다.
[[4,2,3],[3],[2,3,4,1],[2,3]]
[4, 2, 3]
[3]
[2, 3, 4, 1]
[2, 3]

2. 뽑은 숫자들을 길이 순서대로 정렬한다.
[3]
[2, 3]
[4, 2, 3]
[2, 3 4, 1]

3. 첫번째 배열의 숫자를 뽑고(3), 두번째 배열에서는 안뽑힌 숫자(2)를 뽑고, 세번째 배열에서도 안뽑힌 숫자(4)를 뽑고.. 반복

내 코드

  • StringTokenizer과 split을 쓰지 않은 더러운코드…반성하자
package org.programmers;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class kakao_64065 {
	public int[] solution(String s) {

		List<tuple> tuples = new ArrayList<>();
		String s2 = s.substring(1, s.length() - 1); // 앞뒤 괄호 제거

		StringBuilder st = new StringBuilder();
		List<Integer> list = null;
		boolean is_set = false;	// ) 괄호로 닫히지 않았을때만 숫자추가.
		for (int i = 0; i < s2.length(); i++) {
			if (s2.charAt(i) == '(') {
				list = new ArrayList<>();
				is_set = false;
			} else if (s2.charAt(i) == ')') {
				list.add(Integer.parseInt(new String(st)));
				st = new StringBuilder();

				tuples.add(new tuple(list.size(), list));
				is_set = true;
			} else if (s2.charAt(i) == ',' && is_set == false) {
				list.add(Integer.parseInt(new String(st)));
				st = new StringBuilder();
			} else if (s2.charAt(i) != ',' && is_set == false) {
				st.append(s2.charAt(i));
			}
		}

		Collections.sort(tuples);
		Iterator it = tuples.iterator();
		int idx = 0;
		int[] answer = new int[tuples.get(tuples.size() - 1).len];
		HashSet<Integer> hs = new HashSet<>();
		while (it.hasNext()) {
			tuple t = (tuple) it.next();
			List<Integer> integers = t.list;
			for(Integer i:integers) {
				if(!hs.contains(i)) {
					hs.add(i);
					answer[idx] = i;
					idx++;
					break;
				}
			}
		}

		for (Integer a : answer)
			System.out.println(a);
		return answer;
	}
}

class tuple implements Comparable<tuple> {
	int len;
	List<Integer> list;

	tuple(int len, List<Integer> list) {
		this.len = len;
		this.list = list;
	}

	@Override
	public int compareTo(tuple arg0) {

		return this.len - arg0.len;
	}
}

다른 분의 코드

  • StringTokenizer divS = new StringTokenizer(s, “()”); 핵심코드이다.
package org.programmers;

import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class kakao_64065_2 {
	public  int[] solution(String s) {
		int[] answer;
		ArrayList<String> sList = new ArrayList<>();
		ArrayList<String> answerList = new ArrayList<>();
		StringTokenizer divS = new StringTokenizer(s, "()");

		// {}로 나눈다.
		while (divS.hasMoreElements()) {
			String tempString = divS.nextToken();
			System.out.println("tempString ="+tempString);
			// 4,2,3
			// ,
			// 3
			// ,  이런식으로 값이 분리된다.
			if (!tempString.equals(","))
				sList.add(tempString);
		}

		// 길이 순서대로 정렬.
		Collections.sort(sList, (o1, o2) -> {
			return Integer.compare(o1.length(), o2.length());
		});
		// 맨앞에 값 추가
		answerList.add(sList.get(0));
		// 그 뒤부터 입력 안된 값 추가
		for (int i = 1; i < sList.size(); i++) {
			String[] tempChar = sList.get(i).split(",");
			for (int j = 0; j < tempChar.length; j++) {
				// asnwerList에 없는 값만 추가한다.
				if (!answerList.contains(tempChar[j]))
					answerList.add(tempChar[j]);
			}
		}

		return answerList.stream().mapToInt(Integer::parseInt).toArray();
	}
}