프로그래머스: 같은 숫자는 싫어

kgh128·2023년 2월 5일

코드: https://github.com/kgh128/Problem-Solving/blob/main/src/Programmers/%EA%B0%99%EC%9D%80_%EC%88%AB%EC%9E%90%EB%8A%94_%EC%8B%AB%EC%96%B4.java


1. 스택으로 중복 제거

스택이 비어있으므로 가장 0번째 원소는 스택에 바로 넣어준다. 안그러면 0번째 원소 때 스택이 비어있는 상태에서 stack.peek()을 하게 되어서 예외가 발생한다. 1번째 원소부터 반복문을 돌면서 스택의 가장 위에 있는 원소와 값이 다르면 스택에 집어넣는다.

Stack<Integer> stack = new Stack<>();
        
stack.push(arr[0]);
        
for (int i = 1; i < arr.length; i++) {
	if (arr[i] != stack.peek()) {
		stack.push(arr[i]);
	}
}

2. 결과 배열 만들기

answer 배열을 스택의 원소 개수만큼의 크기로 만든다. 결과 배열은 입력 배열의 원소들의 순서를 유지해야 하므로 스택에 밑에 깔려있는 원소들이 결과 배열의 앞에 와야 하고, 위에 있는 원소들이 결과 배열의 뒤에 와야 한다. 따라서 stack.pop() 한 값을 answer 배열의 뒤에서부터 넣어준다. 그러기 위해서 iterator의 값을 마지막 인덱스 값으로 초기 설정하고, 값을 하나씩 줄여나가면서 반복문을 돈다.

int[] answer = new int[stack.size()];

for (int i = answer.length-1; i >= 0; i--) {
	answer[i] = stack.pop();
}

처음에는 answer 배열을 그냥 입력 배열의 최대 크기(1,000,000)로 만들어놓고, 스택의 원소를 집어넣었다. 그러면 의도했던 값은 나오지만, 그 뒤에 0으로 초기화된 빈 원소들까지 같이 반환되어 틀렸었다.

예를 들어 원하는 결과 배열은 [1,2] 인데, [1,2,0,0,0,0,0,0,0,0,0,0,0] 이런 식으로 나왔다.

그래서 answer의 크기를 stack의 크기로 만들어서 딱 맞게 반환하였다. 결과 배열을 리턴할 때 딱 결과만 보여야 한다는 것을 신경써야겠다. 백준처럼 직접 출력하는 것이 아니다 보니까 간과했던 것 같다.

0개의 댓글