1️⃣ 문제 설명
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
- arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
- arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
2️⃣ 제한 사항
- 배열 arr의 크기 : 1,000,000 이하의 자연수
- 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
3️⃣ 입출력 예
arr | answer |
[1,1,3,3,0,1,1] | [1,3,0,1] |
[4,4,4,3,3] | [4,3] |
🌱 문제풀이
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
int[] answer = new int[arr.length];
answer[0] = arr[0];
int count = 0;
//배열을 순서대로 새로운 answer에 넣고, 만약 같으면 넣지 말고
for(int i = 1; i < arr.length; i++){
if(answer[count] != arr[i]){
count++;
answer[count] = arr[i];
}
}
//남은 배열의 0을 없애기, 배열 복사
int[] answer2 = Arrays.copyOf(answer, count+1);
return answer2;
}
}
배열을 사용해서 문제를 풀었다. ArrayList나 LinkedList같은 List의 사용법을 까먹었기에 배열을 사용했다.
먼저 count변수를 따로 만들어서 answer[count] 의 요소와 arr[i]의 요소를 비교해서 같지 않을 경우 count+1 인덱스값에 추가한다.
그리고 처음에 정답이 될 배열의 크기를 몰라서 arr의 길이 만큼 할당했었는데, 배열을 하나 새로 만들어서 정답이 된 answer의 길이 만큼 복사해서 재 할당해준다.
answer가 쓸데 없는 공간을 낭비한다.
🛎️ NEW
ArrayList
ArrayList는 List 인터페이스를 상속받은 클래스로 크기가 가변적으로 변하는 선형리스트다.
한번 생성되면 크기가 변하지 않는 배열과는 달리 ArrayList는 객체들이 추가되어 저장 용량을 초과한다면 자동으로 부족한 크기만큼 저장 용량이 늘어난다는 특징을 가지고 있다.
사용 예제
ArrayList list = new ArrayList();//타입 미설정 Object로 선언된다.
ArrayList<Student> members = new ArrayList<Student>();//타입설정 Student객체만 사용가능
ArrayList<Integer> num = new ArrayList<Integer>();//타입설정 int타입만 사용가능
ArrayList<Integer> num2 = new ArrayList<>();//new에서 타입 파라미터 생략가능
ArrayList<Integer> num3 = new ArrayList<Integer>(10);//초기 용량(capacity)지정
list.add(3); //값 추가
list.remove(1); //index 1 제거
list.clear(); //모든 값 제거
list.size() //리스트의 크기 구하기
list.get(0); //0번째 index 값 가져오기
list.contains(1); //list에 1이 있는지 검색 : true
list.indexOf(1); //1이 있는 index반환 없으면 -1
문제풀이
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
ArrayList<Integer> tempList = new ArrayList<Integer>();
int preNum = 10;
for(int num : arr) {
if(preNum != num)
tempList.add(num);
preNum = num;
}
int[] answer = new int[tempList.size()];
for(int i=0; i<answer.length; i++) {
answer[i] = tempList.get(i).intValue();
}
return answer;
}
}
LinkedList
ArrayList는 데이터가 늘어나면 늘어날 수록 성능에 악영향이 미치기에 중간에 데이터를 insert를 해야할 경우가 많다면 ArrayList보다는 LinkedList를 활용하시는 것도 좋은 방법이다.
Node는 LinkedList에 객체를 추가하거나 삭제하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다. 중간에 데이터를 추가나 삭제하더라도 전체의 인덱스가 한 칸씩 뒤로 밀리거나 당겨지는 일이 없기에 ArrayList에 비해서 데이터의 추가나 삭제가 용이하나, 인덱스가 없기에 특정 요소에 접근하기 위해서는 순차 탐색이 필요로 하여 탐색 속도가 떨어진다는 단점이 있다. 그러므로 탐색 또는 정렬을 자주 하는 경우엔 배열을 사용하고 데이터의 추가/삭제가 많은 경우 연결 리스트를 사용하는 것이 좋다.
사용 예제
LinkedList<Integer> num = new LinkedList<Integer>();//타입설정 int타입만 사용가능
LinkedList<Integer> num2 = new LinkedList<>();//new에서 타입 파라미터 생략가능
LinkedList<Integer> list2 = new LinkedList<Integer>(Arrays.asList(1,2));//생성시 값추가
list.addFirst(1);//가장 앞에 데이터 추가
list.addLast(2);//가장 뒤에 데이터 추가
list.add(3);//데이터 추가
list.add(1, 10);//index 1에 데이터 10 추가
list.removeFirst(); //가장 앞의 데이터 제거
list.removeLast(); //가장 뒤의 데이터 제거
list.remove(); //생략시 0번째 index제거
list.remove(1); //index 1 제거
list.clear(); //모든 값 제거
list.size(); //list 크기 : 3
list.get(0); //0번째 index 값
list.contains(1); //list에 1이 있는지 검색 : true
list.indexOf(1); //1이 있는 index반환 없으면 -1
'Programming > Algorithm' 카테고리의 다른 글
[프로그래머스] Lv.1 예산 - JAVA (0) | 2023.09.12 |
---|---|
[프로그래머스] Lv.1 3진법 뒤집기 - JAVA (0) | 2023.09.05 |
[프로그래머스] Lv.1 최대공약수와 최소공배수 - JAVA (0) | 2023.09.04 |
[프로그래머스] Lv.1 문자열 다루기 기본 - JAVA (0) | 2023.09.03 |
[프로그래머스] Lv.1 문자열 내림차순으로 배치하기 - JAVA (0) | 2023.09.02 |
댓글