프로그래머스 - 튜플

박철현·2023년 12월 4일

프로그래머스

목록 보기
67/80

프로그래머스 - 튜플

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;

class Solution {
	public int[] solution(String s) {
		s = s.replace("{", "");
		// 맨 뒤 }} 제거
		s = s.substring(0, s.length() - 2);
		// 각 튜플에 속한 집합 추출
		String[] eachSet = s.split("},");
		// 각 문자열 길이만큼 정렬
		Arrays.sort(eachSet, (s1, s2) -> s1.length() - s2.length());
		// 길이가 짧은 순 -> 앞에 나오는 숫자니 순서는 중요
		Set<Integer> resultTuple = new LinkedHashSet<>();
		for (String set : eachSet) {
			String[] setInNumbers = set.split(",");
			// 숫자 하나씩 set에 넣기
			for (String number : setInNumbers) {
				resultTuple.add(Integer.parseInt(number));
			}
		}

		return resultTuple.stream()
			.mapToInt(Integer::intValue)
			.toArray();
	}
}
  • 문제를 잘 읽어야 하는 문제
  • 튜플
    • 원소의 순서가 다르면 서로 다른 튜플
      • (1, 2, 3) != (1, 3, 2)
    • 중복된 원소가 없는 튜플 (a1, a2, a3, .., an)일때 아래의 Set으로 표현 가능
      • 즉, 튜플이 주어지면 set으로 아래와 같이 표현 가능함
      • {a1}, {a1, a2}, ... {a1, a2, ..., an}
      • 각각의 Set들은 순서가 상관 없어서 바뀌어도 동일
        • {a1, a2} = {a2, a1}
  • 즉 튜플이 주어졌을 때, 그 튜플로 만들 수 있는 Set s를 주고 튜플을 찾으라는 문제
    • 만들 수 있는 Set s 내부에 있는 Set들은 순서 변경이 가능하다
  • 예제 2번째 것을 보면
    -"{{1,2,3},{2,1},{1,2,4,3},{2}}"
    • {2}, {2,1}, {1,2,3}, {1,2,4,3} 순으로 정렬할 수 있다.
      • 위에서 튜플 (a1, a2, a3, ..., an) -> {a1}, {a1, a2}, .. {a1, a2, ..., an} 집합 형태로 표현 가능이니
      • 원소가 1개씩 늘어는 순으로 튜플 형성됨
    • 따라서 이전 Set에 있는 숫자에서 추가된 숫자가 튜플에 추가되는 수가 된다({2}, {2, 1} => 튜플 번환 시 (2, 1))
  • 최종 풀이
    • eachSet : 문제에서 주어진 s에서 숫자와 콤마로 구분하고 각각의 Set을 String 배열로 구분
      • 구분하고, 길이가 짧은 순으로 정렬한다.
        • 예제 3 : "{{20, 111}, {111}}" -> [111], [20, 111] => 각각의 Set에서는 순서 바꿀 수 있으니 -> [111], [111, 20](순서 변경) 과 같음 => 튜플 변환 : (111, 20)
    • resultTuple :
      • 각 Set의 추가되는 숫자 1개씩을 중복 없이 추가해야 최종 튜플
      • 순서도 중요하기에 LinkedHashSet 이용
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글