문제
해결 방안 고민
•
중복을 허용하지 않으면서 반환할 때는 그 순서를 유지해야 하는 조건을 충족시켜야 하는 문제이다.
해결 방법
•
1번째 방법
◦
continue와 arr[i-1], arr[i] 의 요소를 활용하여 해결하였다.
•
2번째 방법
◦
향상된 for문 + temp 변수 활용하여 해결하였다.
•
3번째 방법
◦
Stack만 활용하여 해결하였다.
코드
•
1번 코드 - 배열 조건 + continue
package algo250308;
import java.util.*;
// 같은 숫자는 싫어 - Lv1 (continue 활용)
public class Pro12906 {
public int[] solution(int[] arr) {
Stack<Integer> stack = new Stack<>();
int length = arr.length;
for (int i = 0; i < length; i++) {
if (!stack.isEmpty() && arr[i - 1] == arr[i]) {
continue;
} else {
stack.push(arr[i]);
}
}
int size = stack.size();
int[] answer = new int[size];
for (int i = size - 1; i >= 0; i--) {
answer[i] = stack.pop();
}
return answer;
}
}
Java
복사
•
2번 코드 - 향상된 for문 + temp 변수 활용
package algo250308;
import java.util.*;
// 같은 숫자는 싫어 - Lv1
public class Pro12906_2 {
public int[] solution(int[] arr) {
Stack<Integer> stack = new Stack<>();
int temp = -1;
for (int value : arr) {
if (value != temp) {
stack.push(value);
temp = value;
}
}
int answerLength = stack.size();
int[] answer = new int[answerLength];
for (int i = answerLength - 1; i >= 0; i--) {
answer[i] = stack.pop();
}
return answer;
}
}
Java
복사
•
3번 코드 - Stack 만 활용
◦
stack.peek()를 활용하여 중복된 값을 넣지 않도록 같지 않을 경우에만 stack에 추가하도록 함
package algo250308;
import java.util.*;
// 스택만 활용하여 풀이
public class Pro12096_3 {
public Stack<Integer> solution(int[] arr) {
Stack<Integer> stack = new Stack<>();
for (int num : arr) {
if (stack.isEmpty() || stack.peek() != num) {
stack.push(num);
}
}
return stack;
}
}
Java
복사
성능 비교
정확성 부분은 사실 큰 차이가 없었는데 효율성 테스트에서 차이가 있음을 확인할 수 있었다. 아무래도 1, 2번 코드는 배열과 stack을 같이 사용하다 보니 이 부분에서 효율성의 차이가 있지 않을까 싶다. 즉 배열을 통해 데이터를 순회하는 과정에서 시간이 걸리는데 이 과정에서 3번 코드는 배열을 통해 확인하는 과정이 없으니 효율성 면에서 유리할 수밖에 없는 것이다.
•
1번 코드
정확성 테스트
효율성 테스트
•
2번 코드
정확성 테스트
효율성 테스트
•
3번 코드 - Stack 만 활용
정확성 테스트
효율성 테스트