https://school.programmers.co.kr/learn/courses/30/lessons/64065
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
푸는데 40분정도 걸린것같습니다.
이번문제는 여러 함수들을 새로 많이 배웠습니다.
기억해야할점
-String 배열을 배열 원소의 길이, 개수에 따라 오름차순 정렬하는 함수.
- {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}} 이 주어졌다고 생각해봅니다.
이문제를 분석해보면 {2}, {2,1}, {2,1,3}, {2,1,3,4} 이런식으로 새로운 숫자가 추가될때마다 배열 크기도 커집니다.
이를 위하여 위의 배열의 개수에 따라 배열을 우선 정렬해야합니다. 그에 관한 손쉬운 함수들입니다.
Arrays.sort(s_split_temp, new Comparator<String>(){ @Override public int compare(String s1, String s2){ return s1.length() - s2.length(); } });
위의 식을 람다화
Arrays.sort(s_split_temp, (String s1, String s2) -> s1.length() - s2.length());
-String replaceAll 사용방법 (아래 두가지 다 가능)
str = str.replaceAll("\\{|\\}",""); str = str.replaceAll("\\{","").replaceAll("\\}","");
-새로운 숫자가 추가될때마다 배열에 추가되는 것을 어떤식으로 생각해야하는가.
answerArr을 선언합니다.
이번에 {2} 를 처리해야할떄라고 생각합니다.
{2}를 돌면서 answerArr에 해당 값이 있다면 flag = true로 바꾸어 넣지 않습니다. 없다면 다 돈뒤 flag = false인 상태이므로 answerArr.add(2);
{2,4}를 돌면서 answerArr에는 2는 존재하니 flag = true, 4는 answerArr 입장에서 처음보는 숫자이니 flag = false인 상태이므로 answerArr.add(4);
를합니다.
-이문제를 풀수 있는 다른방법으로 HashSet이 있습니다. 그냥 조금 처리를 빠르게 해주는것.
만약 해당 값을 넣었는데 이미 존재하는 값이라면 hashset.add() 했을떄 return 값이 false 이 나옵니다.
그러면 그값은 처리안하고, return 값이 true 라면 answerArr에 넣습니다.
내가 푼방식을 극도로 효율화한 사람. (참고할코드)
class Solution { public int[] solution(String s) { Set<String> set = new HashSet<>(); String[] arr = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , "); Arrays.sort(arr, (a, b)->{return a.length() - b.length();}); int[] answer = new int[arr.length]; int idx = 0; for(String s1 : arr) { for(String s2 : s1.split(",")) { if(set.add(s2)) answer[idx++] = Integer.parseInt(s2); } } return answer; } }
내가 푼 코드
class Solution { int[] answer = {}; ArrayList<Integer> arr = new ArrayList<Integer>(); String[] s_arr; public int[] solution(String s) { String[] s_split_temp = s.substring(1, s.length()-1).split("},"); //String 배열의 각각값들을 길이가 짧은 순서부터 출력하기 위해 오름차순 정렬 Arrays.sort(s_split_temp, new Comparator<String>(){ @Override public int compare(String s1, String s2){ return s1.length() - s2.length(); } }); // Arrays.sort(s_split_temp, (String s1, String s2) -> s1.length() - s2.length()); for(int i=0;i<s_split_temp.length;i++){ String str = s_split_temp[i]; // str = str.replaceAll("\\{|\\}",""); str = str.replaceAll("\\{","").replaceAll("\\}",""); s_arr = str.split(","); for(int j=0;j<s_arr.length;j++){ int a = Integer.parseInt(s_arr[j]); boolean flag = false; for(int k=0;k<arr.size();k++){ if(a == arr.get(k)){ flag = true; } } if(flag == false){ arr.add(a); } } } answer = new int[arr.size()]; for(int i=0;i<arr.size();i++){ answer[i] = arr.get(i); } return answer; } }
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[카카오 기출 문제]단체사진찍기- 레벨 2, BFS + 순열 + 문자열 (0) | 2022.10.30 |
---|---|
[카카오 기출 문제]카카오프렌즈 컬러링북- 레벨 2, BFS (0) | 2022.10.29 |
[카카오 기출 문제][3차] 파일명 정렬 - 레벨 2,구현 + 문자열 (0) | 2022.10.23 |
[카카오 기출 문제] 오픈채팅방 - 레벨 2,구현 + 문자열 (0) | 2022.10.07 |
[카카오 기출 문제] 괄호 변환 - 레벨 2,구현 + 문자열 (0) | 2022.10.05 |