Welcome! Everything is fine.

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

프로그래머스/Lv.1

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

개발곰발 2024. 4. 8.
728x90

📌 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

📌  풀이

연속적으로 등장하는 숫자를 순서를 유지한 채 제거해야하는 문제였다. stack을 사용하여 문제를 풀었다.

  • arr 배열을 순회하면서 아래의 경우에만 stack에 원소를 넣는다.
    •  stack이 비어있는 경우
    • stack의 맨 위의 원소가 지금 넣으려는 arr 배열의 원소와 다른 경우
  • 반환타입에 맞춰 int 배열에 다시 옮겨 담는다. 단, LIFO(Last In First Out) 구조인 stack의 특성을 고려해 배열의 맨 뒤부터 채워넣는다.

📌  stack 사용법

stack은 다음과 같이 선언한다.

import java.util.Stack;

Stack<자료형> 변수명 = new Stack<>();

 

다음은 stack의 기본적인 메서드이다. pop()이나 peek()을 할 때, stack이 비어있다면 EmptyStackException이 발생하므로 주의한다. 

  • push() : stack에 객체를 저장한다.
  • pop() : stack의 맨 위의 객체를 꺼낸다.
  • isEmpty() : stack이 비어있으면 True, 비어있지 않으면 False를 반환한다.
  • peek() : stack의 맨 위의 객체를 꺼내지는 않고 반환한다.

📌 전체 코드

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        Deque<Integer> stack = new ArrayDeque<>();
        for (int num : arr) {
            if (stack.isEmpty() || stack.peek() != num) {
                stack.push(num);
            }
        }
        
        int[] answer = new int[stack.size()];
        for (int i = answer.length - 1; i >= 0; i--) {
            answer[i] = stack.pop();
        }

        return answer;
    }
}

📌 또 다른 코드

stack이 아닌 ArrayList로 푸는 방법도 있었다.

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(arr[0]);

        for (int i = 1; i < arr.length; i++) {
            if (arr[i] != arr[i - 1])
                list.add(arr[i]);
        }

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

        return answer;
    }
}