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;
}
}

 

+ Recent posts