프로그래머스 문제
SET
- 모든 중복이 사라짐, 순서보장 x(i-1)
에 있는 숫자와 다르면 넣는다. List<Integer> answerList = new ArrayList<>();
answerList.add(arr[0]);
// 리스트의 마지막 번째와 arr[i]를 비교해서 같지 않으면 list.add()
// 그 다음 list를 array로
🔽 오류코드
public static void main(String[] args) {
int [] arr = {1,1,3,3,0,1,1};
List<Integer> answerList = new ArrayList<>();
for (int i = 0; i < arr.length-1; i++) {
if (arr[i] != arr[i+1]) {
answerList.add(arr[i]);
}
}
System.out.println(answerList);
}
결과 : [1,3,0]
예상 : [1,3,0,1]
i
가 arr의 맨 끝 수에 접근하지 않아 arr[5]에서 다음 값인 arr[6]이 같으니까 list에 넣지 않았고, for문의 종료조건이 i < arr.length-1;
이였기 때문에 arr[6]은 비교할 다음 값이 존재 하지 않았다.if (arr[i] != arr[i+1])
-> if (answerList.get(answerList.size() - 1) != arr[i])
🔽 수정코드
public static void main(String[] args) {
int [] arr = {1,1,3,3,0,1,1};
List<Integer> answerList = new ArrayList<>();
answerList.add(arr[0]);
for (int i = 1; i < arr.length; i++) {
if (answerList.get(answerList.size() - 1) != arr[i]) {
answerList.add(arr[i]);
}
}
System.out.println(answerList);
}
🔽 제출에 맞게 수정된 코드
public int[] solution(int []arr) {
List<Integer> answerList = new ArrayList<>();
answerList.add(arr[0]);
for (int i = 1; i < arr.length; i++) {
if (answerList.get(answerList.size() - 1) != arr[i]) {
answerList.add(arr[i]);
}
}
int [] answer = new int [answerList.size()];
for (int i = 0; i < answerList.size(); i++) {
answer[i] = answerList.get(i);
}
return answer;
}
public static void main(String[] args) {
...
}
}
장점
.peek() <> answerList.get(answerList.size() - 1)
list.add()보다 cost가 적다.
단점
거꾸로 꺼내야 하는 것
public int[] solution(int[] arr) {
// 1. 스택 만들어서 중복 제거 하여 스택에 넣기
Stack<Integer> stack = new Stack<>();
stack.push(arr[0]);
for (int i = 1; i < arr.length; i++) {
if (stack.peek() != arr[i]) {
stack.push(arr[i]);
}
}
// 2. 스택 pop()이용해 배열로 옮겨주기 (꺼꾸로 꺼내야 함에 주의)
int[] answer = new int[stack.size()];
for (int i = stack.size()-1; i >= 0; i--) {
answer[i] = stack.pop();
}
return answer;
}