[프로그래머스,Level 2] 튜플 (JAVA 구현)

2021. 2. 3. 16:43·CodingTest/프로그래머스(Programmers)
반응형

- 첫 풀이 및 정답풀이

  이 문제는 튜플에 속하는 원소들이 주어져 그것을 바탕으로 튜플을 구하는 것인 문제이다. 입출력 예제 1번을 통해 살펴보면, [2, 1, 3, 4]라는 튜블이 있을 때 이 튜블에 속하는 원소는 가장 앞에 있는 숫자부터 차례대로 붙여나가면 된다. 

즉, 첫 번째 원소는 가장 앞에 있는 {2}/ 두 번째 원소는 앞선 원소와 그다음 숫자인 {2,1}/ 세 번째 원소는 {2, 1, 3}/ 네 번째 원소는 {2, 1, 3, 4}가 된다. 

 

  단, 주의해야 할 점은 튜블 원소 내의 숫자들의 위치는 바뀔 수 있다는 점이다. 위의 세 번째 원소를 예로 들면, {1, 3, 2}도 튜플의 원소가 될 수 있다. 

 

  튜플의 원소들은 뒤로갈수록 길어지는 특징이 있기 때문에, 원소들의 길이를 기준으로 정렬한 뒤 가장 짧은 원소부터 고려하며 튜플을 채워나가면 된다. 필자는 여기까지 생각이 되었지만 문자열 가공에 대한 경험이 적어 완전히 해결하지 못해 이 부분을 다른 분들의 풀이를 참고했다.


  문제에서 주어지는 튜플의 원소 집합은 {{~}, {~}}와 같은 형태이다. 우리가 고려해야 하는 것은 큰 중괄호 안에 있는 중괄호들이기 때문에, 가장 앞의 {{ 와 가장 뒤의 }}는 필요가 없는 부분이다. 이를 String 클래스의 substring()메소드로 제거하면 ~}, {~}, {~와 같은 형태의 문자열이 남게 된다.

 

  이제 남은 },{ 의 문자열을 별도의 문자열로 replace()한 뒤, 해당 문자열로 split()을 해주면, 문자열 배열 형태로 분리가 가능하다. 단, 튜플의 원소 내에도 ,로 각 정수들이 구분되어 있으므로 분리된 문자열에 대해서도 split()을 수행하여 각 숫자들을 뽑아낼 수 있다. 마지막으로 ArrayList 클래스에서 제공하는 contains()메소드를 이용해 조건에 따라 원소들을 ArrayList에 담아주면 된다.

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Arrays;

class Solution {
    
    public ArrayList<Integer> solution(String s) {
        
        // 1. 튜플을 만들 ArrayList 객체.
        ArrayList<Integer> answer = new ArrayList<>();
        // 2. 가장 앞의 {{ 를 제거한다.
        s = s.substring(2,s.length());
        // 3. 가장 뒤의 }} 를 제거한 뒤, },{ 형태의 문자열을 -로 바꾼다.
        s = s.substring(0,s.length()-2).replace("},{","-");
        // 4. 위에서 바꾼 문자열을 기준으로 split 해준다.
        String str[] = s.split("-");        
        // 5. 나눠진 문자열 배열을 길이에 따라 다시 정렬한다.
        Arrays.sort(str,new Comparator<String>(){
            public int compare(String o1, String o2){
                
                return Integer.compare(o1.length(), o2.length());
            }
        });
        
        // 6. 각 문자열을 탐색한다.
        for(String x : str){
            // 7. 한 문자열마다 ,를 기준으로 split하여 새로운 문자열 배열을 만든다.
            String[] temp = x.split(",");
            // 8. 새로만든 문자열 배열에는 정수값만 존재하며 이를 탐색한다.
            for(int i = 0 ; i < temp.length;i++){
                // 9. 각 문자열 값을 정수로 바꾼다.
                int n = Integer.parseInt(temp[i]);
                // 10. 튜플에 들어있는 값이 아니라면 추가해준다.
                if(!answer.contains(n))
                    answer.add(n);
            }
        }
        
        return answer;
    }
}

 

 

저작자표시 (새창열림)
'CodingTest/프로그래머스(Programmers)' 카테고리의 다른 글
  • [프로그래머스,Level 2] 단체사진 찍기 (JAVA 구현)
  • [프로그래머스,Level 2] 괄호 변환 (JAVA 구현)
  • [프로그래머스,Level 2] 메뉴 리뉴얼 (JAVA 구현)
  • [프로그래머스,Level 2] N개의 최소공배수 (JAVA 구현)
뜸부깅
뜸부깅
코딩에 대한 여러 개인적인 생각을 정리하고 공부를 하는 공간입니다!!
  • 뜸부깅
    코오오딩
    뜸부깅
  • 전체
    오늘
    어제
    • Note (429)
      • Skill (31)
        • Java & Spring (9)
        • Javascript & HTML & CSS (0)
        • React (0)
        • Next.js (22)
      • CodingTest (389)
        • 백준 온라인 저지(BOJ) (140)
        • 프로그래머스(Programmers) (79)
        • LeetCode (170)
      • Algorithm & Data Structure (6)
      • [Project] 포트폴리오 (3)
        • Front end (3)
        • Back end (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    boj2108
    자바
    Java
    백준1427
    알고리즘
    meidum
    boj1427
    Easy
    백준
    BOJ
    백준2751
    next 14
    백준7576
    leetcode 2236
    medium
    component-scan
    프로그래머스
    TypeScript
    백준1260
    백준7576자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
뜸부깅
[프로그래머스,Level 2] 튜플 (JAVA 구현)
상단으로

티스토리툴바