코딩테스트/프로그래머스

[Java] 프로그래머스 Level 1 : 같은 숫자는 싫어

이덩우 2023. 6. 28. 14:39

- 문제설명

- 예시

- 해결과정

  • 문제 분류가 스택/큐여서 처음에는 의아했다. 스택/큐를 이용하지 않아도 바로 풀 수 있을 것 같은데..
  • 그래도 스택/큐를 이용해서 풀어보고자 했다!
  • 먼저 큐에 모든 입력을 다 담아준다.
  • 먼저 하나를 poll() 하고, while문을 이용해 peek()값과 이전의 poll()값이 똑같다면 다시 poll()하도록 만들었다.
  • 이렇게 중복값을 없애고 결과 리스트에 담아준다. 아래는 실제 코드이다.
import java.util.*;

public class Solution {
    public int[] solution(int[] arr) {
        Queue<Integer> q = new LinkedList<>();
        ArrayList<Integer> result = new ArrayList<>();
        for(int a : arr) q.add(a);
        
        while(!q.isEmpty()) {
            int temp = q.poll();
            try {
                while(temp == q.peek()) {
                    q.poll();
                }
                result.add(temp);
            } catch(NullPointerException e) {
                result.add(temp);
            }
        }

        return result.stream()
                    .mapToInt(i -> i)
                    .toArray();
    }
}
  • 결과적으로 유효성 검사를 일부만 통과하고 완벽하게 통과하지 못했다.
  • 큐에 담아놓은 후에 중복값을 없애는 부분에서는 비효율적인 부분을 찾지 못했다.
  • 결국 큐에 모든 값을 일단 담아놓고 시작한다는 점이 문제가 아닐까 싶어서 큐를 이용하지 않기로 했다!
  • 동일한 논리로, 입력 배열을 바로 순회하면서 이전값과 현재값이 같지 않을때만 결과 리스트로 더해주었다.
  • 효율성 검사도 통과했다!

- 솔루션

import java.util.*;

public class Solution {
    public int[] solution(int[] arr) {
        ArrayList<Integer> result = new ArrayList<>();
        int previous = -1;
        for(int present : arr) {
            if(present != previous) result.add(present);
            previous = present;
        }
        
        return result.stream()
                    .mapToInt(i -> i)
                    .toArray();
    }
}

- 정리

  • 문제 대분류에 너무 의식하지 말자. 실제 코딩테스트에서도 특정 알고리즘을 사용하면 된다고 알려주지 않는다.
  • 데이터를 가공할 때 스트림 & 람다를 적극 활용하자