코린이의 소소한 공부노트

[프로그래머스/Lv.1] 같은 숫자는 싫어 본문

코딩테스트 풀이/JAVA

[프로그래머스/Lv.1] 같은 숫자는 싫어

무지맘 2022. 11. 26. 00:38

1. Input

1) int 배열 arr

2) arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 함

 

2. Output

1) 제거하고 남은 수를 담은 배열

2) 정렬해서 반환하는 것이 아닌, 원래의 순서를 유지해야 한다.

 

3. Constraint

1) arr의 크기: 1,000,000 이하의 자연수

2) arr의 원소는 0 이상 9 이하의 정수

 

4. Example

Input: arr={1,1,3,3,0,1,1} -> Output: {1,3,0,1}

 

5. Code

1) 첫 코드(2022/??)

import java.util.*;
 
if(arr.length == 1) return arr;

List<Integer> list = new ArrayList();
list.add(arr[0]);
for(int i=1 ; i<arr.length ; i++)
    if(arr[i-1] != arr[i]) list.add(arr[i]);

int[] answer = new int[list.size()];
for(int i=0 ; i<answer.length ; i++)
    answer[i] = list.get(i);
return answer;

2) Stack을 사용한 코드(2022/11/26)

import java.util.*;

Stack<Integer> st = new Stack<Integer>(); // 지네릭스 안쓰면 pop() 후 저장하는 데 언체크드 에러
st.push(arr[0]);
for(int i=1 ; i<arr.length ; i++){
    if(!st.peek().equals(arr[i]))
        st.push(arr[i]);
} // for i

int[] answer = new int[st.size()];
for(int i=answer.length-1 ; i>=0 ; i--)
    answer[i] = st.pop();
return answer;

  - 잘 짰다고 생각했는데, 1번보다 느리고 효율성 테스트에서도 안좋게 나옴

  - main 첫 시작에 if(arr.length==1) return arr; 한 줄 추가해서 다시 돌려보니 조금 괜찮게 나오긴 했지만, 역시 1번이 더 좋았음