개발 무지렁이

[문제풀이] Level1 같은 숫자는 싫어 본문

코딩 테스트/문제풀이

[문제풀이] Level1 같은 숫자는 싫어

Gaejirang-e 2023. 2. 28. 15:16

같은 숫자는 싫어


  🪅 중복을 제거하는 방법으로 스택을 생각해낼 수 있느냐
  🪅 스택을 Integer[]로, Integer[]을 int[]로 변환할 수 있느냐

💡 문제 접근 과정
단순히 중복을 제거하는 문제인 줄 알았다.
때문에 HashSet 자료구조가 생각났고, 그중에서도 넣은 순서를 보장하는 LinkedHashSet을 떠올렸다.
하지만, 자세히보니 이 문제는 단순히 중복을 제거하는 문제가 아닌 이웃한 수의 중복을 제거하는 문제였다.
바로 LinkedHashSet을 버리고, 다른 방식으로 생각해보기로 했다.
순서를 보장하는 List를 이용하면 되겠다 싶어, 배열의 원소들을 List에 넣은 뒤
현재원소와 다음원소를 비교해, 같으면 다음 원소를 지워주는 방식으로 코드를 작성했다
하지만 list에 원소를 넣었다가 빼는 과정이 너무 많아서인지(?) 효율성 테스트를 통과하지 못했다.

그렇다면 처음에 자료구조에 배열의 원소를 다 넣지 않고 그 즉시 비교해서
문제의 조건을 만족하는 것만 자료구조에 넣으면 되겠다는 생각이 들었고, 문득 Stack이 떠올랐다.
Stack의 peek() 메서드를 이용해서 제일 위에있는 값과 현재 배열에서 가져온 값을 비교해서,
같으면 현재 원소를 그냥 넘기고, 같지 않으면 Stack에 넣는 방식으로 구현했더는 효율성 테스트까지 통과할 수 있었다.

[효율성테스트 통과하지 못한 코드].java

import java.util.*;

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

        // list 초기화
        for(int i = 0; i < arr.length; i++) {
            list.add(arr[i]);
        }

        int num = 0;
        for(int i = 0; i < list.size()-1; i++) {
            num = list.get(i);
            // 다음꺼와 비교
            int compare = list.get(i+1);

            // 만약 같다면 다음꺼를 지운다
            if(num == compare) {
                list.remove(i+1);
                i--;
            }   
        }
        Integer[] arrWrapper = list.toArray(new Integer[0]);
        int[] answer = Arrays.stream(arrWrapper).mapToInt(Integer::intValue).toArray();

        return answer;
    }
}

[효율성테스트 통과한 코드].java

import java.util.*;

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

        Integer[] arrWrapper = stack.toArray(new Integer[0]);
        answer = Arrays.stream(arrWrapper).mapToInt(Integer::intValue).toArray();
        return answer;
    }
}

'코딩 테스트 > 문제풀이' 카테고리의 다른 글

[문제풀이] Level1 폰켓몬  (0) 2023.02.28
[문제풀이] Level2 기능개발  (0) 2023.02.28
[문제풀이] Level2 타겟넘버  (0) 2023.02.24
[문제풀이] Level2 카펫  (0) 2023.02.23
[문제풀이] Level1 모의고사  (0) 2023.02.23
Comments