프로그래머스 - 같은 숫자는 싫어
카테고리: 스택/큐
레벨: 1
문제 풀이 언어: Java
문제
입/출력 예시
문제 풀이
public int[] solution(int []arr) {
int[] answer;
Stack<Integer> stack = new Stack<>(); // Integer 스택 생성
for (int i = 0; i < arr.length; i++) { // 입력값만큼 반복문을 돈다.
if (i == 0) stack.push(arr[i]); // 스택에 데이터 삽입
else if (stack.peek() != arr[i]) stack.push(arr[i]); // 최근에 삽입한 데이터가 현재 데이터와 다를 경우 삽입
}
answer = new int[stack.size()]; // 최종 스택의 사이즈만큼 배열을 초기화
for (int i = stack.size() - 1; i >= 0; i--) { // 스택의 사이즈만큼 반복문을 돌면서 배열에 데이터 삽입
answer[i] = stack.pop();
}
return answer;
}
정답 풀이를 살펴보면 먼저 새로운 Stack을 생성해 준다.
그다음 for문을 수행하면서 Stack에 데이터를 삽입하게 되는데 peek() 메서드를 사용해서 들어가는 데이터와 다르다면 Stack에 데이터를 삽입해 준다.
for문이 끝나고 난 후 answer[] 배열에 Stack의 길이만큼 초기화를 진행해 준다.
마지막으로 for문으로 answer[] 배열에 데이터를 추가한 뒤 answer를 출력해 준다.
그림으로 살펴보면 한층 더 이해하기 쉽다.
가장 먼저 첫 번째 데이터인 1은 Stack이 비어있기 때문에 push를 해준다.
그다음으로 오는 데이터도 똑같은 1인데 여기서 Stack의 peek를 이용하여 현재 Stack의 가장 위에 위치한 데이터를 보여준다. 따라서, peek와 삽입하는 데이터가 같다면 연속되는 숫자가 들어온다는 것을 알 수 있는데 그럴 경우 삽입하지 않고 넘어가게 된다.
마지막으로 들어오는 3은 현재 Stack에 가장 위에 위치한 데이터와 다르기 때문에 push가 된다.
Queue<Integer> queue = new LinkedList<>();
for(int i = 0; i < arr.length; i++) {
if(i == 0) {
queue.add(arr[i]);
} else {
if (queue.peek() == arr[i]) {
queue.add(arr[i]);
}
}
}
int[] answer = new int[queue.size()];
for(int i = 0; i < queue.size(); i++) {
answer[i] = queue.poll();
}
return answer;
내가 작성한 코드를 보면 Queue를 이용해서 문제를 풀어봤는데 당연히 실패했다.
얼추 peek를 이용한다는 것은 알고 있었지만 연속된 숫자를 확인해야 되는 경우에는 Stack을 사용해야 되는 것을 잊고 있었다.
Stack과 Queue의 peek는 어디에 있는 데이터를 보여주는 것인가에 차이가 있다.
Stack과 Queue는 데이터를 삽입, 삭제하는 방식이 다른데 Stack은 가장 먼저 들어간 데이터가 가장 마지막에 나오고, Queue에서는 가장 먼저 들어간 데이터가 가장 먼저 나오게 된다.
peek() 메서드를 사용하면 Stack은 가장 마지막에 들어온 데이터 즉, 가장 상단에 위치한 데이터를 보여주게 되고, Queue는 맨 처음으로 들어온 데이터를 보여주게 된다.
따라서 연속된 숫자를 판별하기 위해서는 Queue를 사용해서 해결할 수는 없을 것 같다.
'알고리즘 공부' 카테고리의 다른 글
프로그래머스 - 올바른 괄호 (0) | 2023.12.04 |
---|---|
프로그래머스 - 기능개발(Java) (1) | 2023.11.29 |
자바 백준_실버5 - 25206번 (0) | 2023.10.06 |
백준 실버3 2346번(자바) (0) | 2023.09.07 |
백준 실버2 18870(자바) (0) | 2023.09.07 |