코딩테스트 연습 - 튜플 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문자열 s가 표현하는 튜플을 배열에 담아 반환하시오.

예를 들어 s = “{{2}, {2,1}, {2,1,3}, {2,1,3,4}}” 이면 튜플은 (2, 1, 3,4)가 된다.

다음으로 s = "{{1,2,3}, {2,1}, {1,2,4,3}, {2}}” 역시도 튜플은 (2, 1, 3, 4)이다.

문자열을 잘 분리하는 것이 핵심이다.

"{{1,2,3}, {2,1}, {1,2,4,3}, {2}}” 를 기준으로 생각해 보자. 각 집합을 구분하는 구분자는 “,”이다. 그렇지만 “,”를 기준으로 나누면 집합 내의 ‘,’의 존재 때문에 안된다.

따라서 ”},”를 기준으로 나누면 어떨까? 우선 시작과 끝의 “{”, “}” 는 없애고 본다.

"{1,2,3}, {2,1}, {1,2,4,3}, {2”

“{1, 2, 3” , “{2, 1”, {1, 2, 4, 3”, “{2”이가 된다.

이제 이거를 숫자의 개수를 기준으로 정렬을 해야 한다.

즉 [”2”, “2, 1”, “1, 2, 3”, “1, 2, 4, 3”] 으로 만들어야 튜플을 구할 수 있다.

  1. substring을 통해 문자열을 잘라낸다.
  2. 그 후 구분자룰 “},”로 삼아 문자열을 배열로 분리한다.
  3. 길이 순으로 오름차순 정렬을 한다.
  4. Set을 통해 중복된 숫자 처리를 한다. LinkedHashSet을 사용해 삽입 순서를 유지해 해당 set을 통해 정답을 구성하겠다.
import java.util.*;

class Solution {
    public int[] solution(String s) {
        s = s.substring(1, s.length() - 2);
        String[] splited = s.split("},");
        Arrays.sort(splited, (a, b) -> Integer.compare(a.length(), b.length()));
        for (int i = 0; i < splited.length; i++) {
            splited[i] = splited[i].substring(1);           
        }
        
        Set<Integer> set = new LinkedHashSet<>();
        for (String words : splited) {
            for (String num : words.split(",")) {
                int v = Integer.parseInt(num);
                if (set.contains(v)) continue;
                set.add(v);
                break;
            }
        }
        
        return set.stream().mapToInt(Integer::intValue).toArray();
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

Programmers 42577 - 전화번호 목록  (0) 2024.10.24
Programmers 62050 - 지형 이동  (0) 2024.10.23
Programmers 60062 - 외벽점검  (0) 2024.10.20
Programmers 92342 - 양궁대회  (0) 2024.10.02
Programmers 12952 - N-Queen  (0) 2024.10.01

+ Recent posts