IT/코딩테스트

[프로그래머스] 같은 숫자는 싫어 - java

타미미 2025. 3. 11. 22:56

Level 1

 

[문제]

https://school.programmers.co.kr/learn/courses/30/lessons/12906

 

[첫번째 풀이]

Stack 문제이기 때문에, Stack을 사용한 풀이

연속되는 숫자를 제거하는 것이라 Stack의 peek와 값이 다르면 데이터를 push

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        Stack<Integer> stack = new Stack<>();
        stack.push(arr[0]);
        
        for(int i=1;i<arr.length;i++ ) {
            if(!stack.peek().equals(arr[i])) {
                stack.push(arr[i]);
            }
        }
        
        int[] answer = new int[stack.size()];

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

        return answer;
    }
}

 

Stack

- LIFO (후입선출)

peek() 최상단에 있는 데이터 조회
pop() 최상단에 있는 데이터 제거 후 반환
push(E item) 데이터 입력
isEmpty 스택이 비어있는지 확인

 

 

[두번째 풀이]

일반적으로 많이 사용하는 ArrayList를 사용한 풀이

문제에서 주어진 arr의 범위는 0~9이기 때문에, tempNum을 해당 범위를 벗어난 값으로 넣어주면 더 간단하게 코드를 구현할 수 있다.

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        ArrayList<Integer> list = new ArrayList<>();
        int tempNum = 10;
        
        for(int num:arr) {
            if(tempNum != num) {
                list.add(num);
                tempNum = num;
            }
        }
        
        int[] answer = new int[list.size()];
        for(int i=0;i<list.size();i++) {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

 

return 타입이 int[] 이므로, ArrayList에 들어있는 데이터를 변환해야 한다.

변환하는 방법은 두가지가 있다.

for문 사용 for(int i=0; i<list.size(); i++) {
   answer[i] = list.get(i);
}
확실하게 입력하려면, intValue() 까지 해주어야 한다.

list.get(i).intValue()
stream() list.stream().mapToInt(i -> i).toArray();

Integer를 int로 변환: mapToInt(i -> i)

 

stream()을 사용하면, 코드가 간단해 보이지만 for문이 더 익숙하기도 하고 성능이 좋다.

 

나는 성능이 중요하기 때문에, 앞으로도 for문을 사용할 듯 하다!

 

 

반응형