[프로그래머스/Lv. 2] 튜플 (JAVA)
🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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