같은 숫자는 싫어

이윤설·2024년 3월 26일


https://school.programmers.co.kr/learn/courses/30/lessons/12906?language=java

제출코드 (오답)

import java.util.*;

public class Solution {
    
    public int[] solution(int[] arr) {
        // LinkedHashSet을 사용하여 입력 순서를 유지하면서 중복을 제거
        Set<Integer> set = new LinkedHashSet<>();
        for (int num : arr) {
            set.add(num);
        }

        // Set을 배열로 변환
        int[] answer = set.stream().mapToInt(Integer::intValue).toArray();

        // 배열을 문자열로 예쁘게 출력
        System.out.println(Arrays.toString(answer));
        
        return answer;
    }
    
    public static void main(String[] args) {
        Solution sol = new Solution();
        // 테스트 코드 실행
        sol.solution(new int[]{1, 2, 2, 3, 3, 3});
    }
}

HashSet으로 구현해봤지만 {1,1,1,2,2,1} 과 같은 경우 {1,2,1}이 만들어져야 하는데, 어떻게 구현해야 할지 감이 오지 않았음.

모범답안

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() != arr[i]) {
                // 다르면 스택에 추가
                stack.push(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()한 요소와 넣고자 하는 요소를 비교한 뒤 중복이 아니면 스택에 추가한다. 이 방법을 통해 연속하는 중복된 수를 한개만 넣을 수 있다.

배운점

  • Arrays.toString(배열이름) -> 배열의 주소값이 아닌 요소들을 출력한다.
  • 스택을 사용하면 연속되는 중복된 수를 1개만 넣거나 출력할 수 있다.
profile
화려한 외면이 아닌 단단한 내면

0개의 댓글