해당 게시글은 [Java] 어서와! 자료구조 알고리즘은 처음이지?https://programmers.co.kr/learn/courses/13577를 간략히 요약한 게시글이며 모든 출처는 해당강의에 있습니다.
배열에서 연속되는 숫자들을 제거하여 하나만 나오도록 하는 문제입니다. 다른 숫자로 바뀌었다가 또 다시 등장할 수도 있습니다.
연속되는 숫자들은 제거하지만 answer로 나오는 배열에는 다른 숫자로 바뀌기만 하면 다시 나올 수 있습니다. 따라서 Set을 그대로 사용하기 보단 Set의 작동 방식을 응용하여 구현하는것이 중요합니다.
import java.util.*;
public class 같은숫자는싫어 {
public static int[] solution(int []arr) {
List<Integer> list = new ArrayList<>();
Set<Integer> set = new HashSet<>();
//첫 숫자는 구함
int prev = arr[0];
set.add(prev);
for(int i=1;i<arr.length;i++){
int now = arr[i];
if(prev == now) set.add(now); //배열에서 같은 값이 나올때 까지 Set으로
else{ //다른 값이 나오면 이전 값은 리스트로, Set에서 삭제, 새로운 값은 Set
list.add(prev);
set.remove(prev);
set.add(now);
}
prev = now;
}
//배열 다 돌면 마지막 Set은 리스트로
Iterator<Integer> iter = set.iterator();
list.add(iter.next());
//배열 반환
return list.stream().mapToInt(i->i).toArray();
}
public static void main(String[] args) {
int[] input1 = {1,1,3,3,0,1,1};
System.out.println(Arrays.toString(input1));
System.out.println(Arrays.toString(solution(input1)));
int[] input2 = {4,4,4,3,3};
System.out.println(Arrays.toString(input2));
System.out.println(Arrays.toString(solution(input2)));
}
}
굳이 Set을 넣어서 풀었었습니다. 연속되는 숫자인지 구하는 곳에서 Set을 통하여 중복을 없앴고, List를 만들어 결과를 반환하는 배열을 만들었습니다.
이전값과 현재값을 비교하여 연속된는 수인지 아닌지를 판단합니다.
arr : 무작위의 수
-> Set : 연속되는 숫자 제거
-> list 숫자 하나만 삽입
2단계에 걸쳐 연속 숫자를 하나로 줄였습니다.
또 List<>컬랙션을 배열로 바꾸기 위해 리스트.stream().mapToInt(i->i).toArray();
로 Integer를 int로 형변환 시켰습니다.
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
List<Integer> list = new LinkedList<>();
int last = -1;
for(int a : arr){
if(last == a) continue;
last = a;
list.add(a);
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
Set을 쓰지 않고 Set의 기능을 응용하여 구현한 것입니다. 중복이면 넘기고 중복이 아닐때만 추가합니다.
이전값과 현재값을 비교하여 연속된는 수인지 아닌지를 판단합니다.
List<>컬랙션을 배열로 바꾸기 위해 리스트.stream().mapToInt(Integer::intValue).toArray();
로 Integer를 int로 형변환 시켰습니다.