본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 64065번: 튜플 [Java]

문제: https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public Set<Integer> solution(String s) {
        Set <Integer> set = new LinkedHashSet<>();
        String[] str = s.split("[{|}]");
        Arrays.sort(str, (String s1, String s2) -> s1.length() - s2.length());
        for(String s1 : str) {
            for(String s2 : s1.split("(,)"))
                if(s2.matches("[0-9]+"))
                    set.add(Integer.parseInt(s2));
        }
        return set;
    }
}

2. 설명

문제 해결 방식은 문자열 s에서 만들어진 집합의 원소 중 길이가 작은 것을 기준으로 순차적으로 입력되지 않은 원소 값을 순서에 맞춰서 저장하면 문제가 해결됩니다.

Set <Integer> set = new LinkedHashSet<>();
String[] str = s.split("[{|}]");
Arrays.sort(str, (String s1, String s2) -> s1.length() - s2.length());

LinkedHashSet을 사용하면 저장 순서를 그대로 기억하며 중복제거가 되기에 사용합니다.  그리고 문자열 s를 대괄호를 기준으로 문자열을 분리해주면 공백과 반점이 포함되지만 집합끼리 묶여서 분리되기에 sort 함수를 사용하여 문자열의 길이를 기준으로 오름차순으로 정렬합니다.

for(String s1 : str) {
    for(String s2 : s1.split("(,)"))
        if(s2.matches("[0-9]+"))
            set.add(Integer.parseInt(s2));
}

문자열을 또 다시 반점을 기준으로 분리하며 해당 문자열이 숫자라면 set에 추가해줍니다. 숫자인지 검사하는 이유는 공백이 있을 수 있기 때문입니다. 그리고 set을 반환하면 문제는 해결됩니다.

3. 정리

  1. LinkedHashSet을 이용하여 중복제거와 순서 유지 가능
  2. 문자열 처리 방법에 대한 고민 필요
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges