본문 바로가기
JAVA/Coding Test Study

[Lv.1] 같은 숫자는 싫어 : Java

by ♡˖GYURI˖♡ 2024. 1. 19.
728x90
 

프로그래머스

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

programmers.co.kr

 

 

 

이해하기

이전에 풀었던 백준 25556.포스택 문제보다는 이해가 됐다. 

스택 관련 문제라고 하니 스택을 활용해야 할 것 같은데... 뭔가 감이 안 잡혀서 처음 풀 때는 ArrayList로 풀어버렸다.

스택을 활용해서 풀 방법을 찾아보자.

 

  1. 스택을 하나 생성한다.
  2. 스택이 비어있거나, 스택의 top에 있는 숫자(→ peek()으로 꺼내자!) 와 비교하여 같은 수가 아니라면 스택에 add()한다.
  3. 요구하는 반환형이 int[]이기 때문에 바꾸어주어야 한다.
  4. int 배열을 하나 만드는데, 사이즈는 앞에서 사용했던 스택의 사이즈로 한다.
  5. 새로 만든 배열에 스택의 숫자들을 옮긴다.
  6. 배열을 리턴한다.

 

문제 풀이

import java.util.Arrays;
import java.util.Stack;

class Solution3 {
    public int[] solution(int[] arr) {
        Stack<Integer> stack = new Stack<>();

        for (int i = 0; i < arr.length; i++) {
            if (stack.isEmpty() || stack.peek() != arr[i]) {
                stack.add(arr[i]);
            }
        }

        int[] answer = new int[stack.size()];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = stack.get(i);
        }

        return answer;
    }
}

 

위에서 적었던 순서대로 작성해보았다.

중간에 약간 헷갈려서 stack.peek() != arr[i] 라고 적어야 하는 걸 stack.peek() < arr[i] 라고 적어버렸다.

 

for문을 더 줄일 수 있을 것 같아서 다시 작성해 보았다.

 

import java.util.Arrays;
import java.util.Stack;

class Solution3 {
    public int[] solution(int[] arr) {
        Stack<Integer> stack = new Stack<>();

        for (int n : arr) {
            if (stack.isEmpty() || stack.peek() != n) {
                stack.add(n);
            }
        }

        int[] answer = new int[stack.size()];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = stack.get(i);
        }

        return answer;
    }
}

 

음... 줄일 수 있을 줄 알았는데 막상 세보니 라인 수는 똑같다 ㅋㅋ... 그래도 더 깔끔한 것 같기는 하다.