-
[프로그래머스] 튜플(2019 카카오 개발자 겨울 인턴십Algorithm 2021. 1. 10. 14:35
프로그래머스에서 2019 카카오 인턴 코테 출제 문제인 튜플을 풀어봤습니다.
이 문제는 예전에 한번 풀었었는데 시간이 많이 지나 기억이 잘 나지 않아서 정리도 할 겸 다시 한번 풀어봤습니다.
당시에 문제 자체를 잘못 이해해서 애먹었던 기억이 나네요ㅎㅎ,,,
순서가 정해진 튜플을 바탕으로 만들어진 집합 배열이 주어지고, 이 배열을 통해 어떤 튜플인지를 찾으면 되는 문제입니다.
이 문제를 풀 때 고려해야할 것들은 다음과 같습니다.
1. 문자열 처리
2. 길이 순 정렬 조건
3. 중복 제거
1. 문자열 처리
주어진 문자열을 '{ }'를 기준으로 잘라줍니다.
아래 두 가지 방법으로 구현해보았습니다.
* StringBuffer를 이용해 괄호가 시작되고 끝날 때까지의 데이터를 뽑아 배열에 넣어줍니다.
StringBuffer sb = new StringBuffer(); boolean flag = false; for(int i=1; i<s.length()-1; i++){ if(s.charAt(i)=='{'){ flag = true; continue; }else if(s.charAt(i)=='}'){ String str = sb.toString(); String[] array = str.split(","); list.add(array); sb.delete(0, sb.toString().length()); flag = false; }else if(flag){ sb.append(s.charAt(i)); } }
* 문자열의 '{ }'를 replaceAll() 메소드를 통해 다른 문자로 변경해주고, split() 메소드를 이용해 배열로 변환합니다.
String[] arr2 = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , ");
2. 길이순 정렬 조건
문자열 배열을 길이에 대해 오름차순으로 정렬합니다.
ArrayList를 사용한 경우 Collections.sort() 메소드를 이용해 Comparator객체를 생성해 다음과 같이 정렬할 수 있습니다.
Collections.sort(list, new Comparator<String[]>(){ @Override public int compare(String[] o1, String[] o2){ if(o1.length>o2.length) return 1; return -1; } });
배열을 사용한 경우 Arrays.sort() 메소드를 이용해 다음과 같이 정렬할 수 있습니다.
Arrays.sort(arr2, (a, b)->{return a.length() - b.length();});
3. 중복 제거
각 배열을 탐색하면서 set에 넣어주고, set에 이미 들어있는 데이터를 제외하면서 튜플 값을 찾아줍니다.
ArrayList를 사용한 경우 다음과 같이 반복문을 실행해 result List에 데이터를 넣어줍니다.
HashSet<String> hset = new HashSet<>(); for(int i=0; i<list.size(); i++){ String[] arr = list.get(i); for(int j=0; j<arr.length; j++){ if(hset.add(arr[j])) result.add(arr[j]); } }
배열을 사용한 경우 다음과 같이 반복문을 실행해 result List에 데이터를 넣어줍니다.
for(String str1 : arr2){ for(String str2 : str1.split(",")){ if(hset.add(str2)) result.add(str2); } }
전체 코드
import java.util.*; class Solution { public int[] solution(String s) { int[] answer; ArrayList<String[]> list = new ArrayList<>(); ArrayList<String> result = new ArrayList<>(); StringBuffer sb = new StringBuffer(); boolean flag = false; for(int i=1; i<s.length()-1; i++){ if(s.charAt(i)=='{'){ flag = true; continue; }else if(s.charAt(i)=='}'){ String str = sb.toString(); String[] array = str.split(","); list.add(array); sb.delete(0, sb.toString().length()); flag = false; }else if(flag){ sb.append(s.charAt(i)); } } Collections.sort(list, new Comparator<String[]>(){ @Override public int compare(String[] o1, String[] o2){ if(o1.length>o2.length) return 1; return -1; } }); HashSet<String> hset = new HashSet<>(); for(int i=0; i<list.size(); i++){ String[] arr = list.get(i); for(int j=0; j<arr.length; j++){ if(hset.add(arr[j])) result.add(arr[j]); } } answer = new int[result.size()]; for(int i=0; i<result.size(); i++){ answer[i] = Integer.parseInt(result.get(i)); } return answer; } }
import java.util.*; class Solution { public int[] solution(String s) { int[] answer; ArrayList<String> result = new ArrayList<>(); String[] arr2 = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , "); Arrays.sort(arr2, (a, b)->{return a.length() - b.length();}); HashSet<String> hset = new HashSet<>(); for(String str1 : arr2){ for(String str2 : str1.split(",")){ if(hset.add(str2)) result.add(str2); } } answer = new int[result.size()]; for(int i=0; i<result.size(); i++){ answer[i] = Integer.parseInt(result.get(i)); } return answer; } }
'Algorithm' 카테고리의 다른 글
[프로그래머스] 문자열 압축(2020 KAKAO BLIND RECRUITMENT) (0) 2021.01.18 [프로그래머스] 괄호 변환(2020 KAKAO BLIND RECRUITMENT) (0) 2021.01.10 [프로그래머스] 후보키(2019 KAKAO BLIND RECRUITMENT) (0) 2021.01.09 [프로그래머스] 오픈채팅방(2019 KAKAO BLIND RECRUITMENT) (0) 2021.01.09 [프로그래머스] 수식 최대화(2020 카카오 인턴십) (0) 2021.01.08