코테/프로그래머스

[프로그래머스/Lv. 2] 튜플 (JAVA)

imname1am 2023. 10. 13. 23:59
반응형

🔺 문제

 

프로그래머스

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

programmers.co.kr

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.*;
import java.util.stream.Stream; // 얘를 꼭 작성해줘야 함!
 
class Solution {
    public int[] solution(String s) {
        List<Integer> list = new ArrayList<>();
        
        // 1. 불필요한 문자들 벗기기
        String[] strArr = s.split("},");
        for(int i = 0 ; i < strArr.length ; i++) {
            String ss = strArr[i].replace("{""").replace("}""");
            strArr[i] = ss;
        }
        
        // 2. 원소 개수가 적은 것부터 정렬하고 실행하기
        Arrays.sort(strArr, (a, b) -> Integer.compare(a.length(), b.length()));
 
        // 3. 만약에 원소 집합에 있는 값이라면 패스하고, 없으면 정답 리스트에 추가하기
        Set<Integer> duplicate = new HashSet<>();   // 원소 집합 (중복 제거)
        List<Integer> ans = new ArrayList<>();      // 정답 리스트
        
        for(String ss : strArr) {
            
            int[] tuple = Stream.of(ss.split(",")).mapToInt(Integer::parseInt).toArray(); // 해당 문자열을 int형 배열로 만들기
            
            for(int i = 0 ; i < tuple.length ; i++) {
                if(!duplicate.contains(tuple[i])) { // 중복된 값이 아니라면, 정답 리스트에 해당 원소 추가
                    ans.add(tuple[i]);
                }
                
                duplicate.add(tuple[i]);
            }
        }
        
        // 4. 결과 int형 배열로 출력하기
        int[] result = new int[ans.size()];
        for(int i = 0 ; i < result.length ; i++) {
            result[i] = ans.get(i);
        }
        
        return result;
    }
}
cs

 

 

🧩  해결 아이디어

1. 불필요한 문자들 없애고 배열로 만들기

      ⇨ .split(), .replace() 메소드 이용

 

2. 원소 갯수가 적은 것부터 실행하도록 길이 기준 오름차순 정렬하기

       ⇨ 람다식에서 Integer.compare() 사용했는데 그냥 a.length() - b.length()해도 된다.

 

3. 원소 집합 (중복X)과 정답 리스트를 생성한다.

3-1. 해당 문자열을 콤마 기준으로 나누고 int형 배열로 바꾼다.

int[] tuple = Stream.of(ss.split(",")).mapToInt(Integer::parseInt).toArray();

 

3-2. 만약 해당 숫자가 원소 집합에 없는 중복되지 않는 값이라면, 정답 리스트에 값을 추가하고, 원소 집합에도 값을 추가한다.

이미 원소 집합에 있는 값이라면, 그냥 원소 집합에 값 추가하기만 한다.

 

 

4. 정답 리스트를 int형 배열로 바꿔 출력한다.

 


🔺 다른 풀이들

- 멋지다........ 이게 원하던 정답 같다. 다음엔 이렇게 풀 수 있도록..!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.*;
 
class Solution {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(solution("{{2},{2,1},{2,1,3},{2,1,3,4}}")));
        System.out.println(Arrays.toString(solution("{{1,2,3},{2,1},{1,2,4,3},{2}}")));
        System.out.println(Arrays.toString(solution("{{20,111},{111}}")));
    }
    
    public static 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;
    }
}
cs


💬 느낀 점

문자열을 어떻게 분리하고 int형 배열로 바꿀지 람다식 고민하다가 시간이 흐름...

람다식을 배워야겠군..

 

근데 람다식을 모르더라도 저 다른 풀이에 있는 답 같이 풀 수 있게 해야지

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

프로그래머스 - 튜플[java]

String array sort by string size

velog.io

 

[Java/자바] 프로그래머스 Lv2 - 튜플

문제 설명 셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습

hstory0208.tistory.com

 

반응형