[코딩테스트]

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

everydeveloper 2024. 4. 6. 13:15

문제 설명

배열 arr 주어집니다. 배열 arr 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. , 제거된 남은 수들을 반환할 때는 배열 arr 원소들의 순서를 유지해야 합니다. 예를 들면,

 

arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] return 합니다.

arr = [4, 4, 4, 3, 3] 이면 [4, 3] return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

 

제한사항

배열 arr 크기 : 1,000,000 이하의 자연수

배열 arr 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

 

시작 전 문제 파악 및 전략 수립

 

생각엔

 

배열을 for 돌면서

 

하나 하나씩 순서대로 임시로 변수에 해당 값을 저장하고

다음 값과 비교하고

같으면 파기 아니면 다른 값을 저장하고

 

새로운 배열에 다시 값들을 저장하면 될듯 하다

 

사용자료구조

LinkedList

 

문제를 몇 번의 시행 착오를 통해서

 

for 문으로 linkedList를 거쳐서 linkedList를 다시 최종 결과 배열 answer로 변환해서 하는 것은 성공했으나 최적화 관련 테스트에서 통과하지 못해서

 

자료 구조 등 다른 방법을 생각해야 했다

LinkedList 자료구조 사용으로 느려서 생긴 문제로 보고

배열로 바꾸고 for문은 그대로 사용하기로 했다

 

내가 구상한 로직상 ArrayList를 조금 쓸 수 밖에 없었는데 다행히

 

간단한 for문이라 속도가 많이 느리진 않았나 보다

 

아래는 최종 통과한 코드이다.

 

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {

        int[] answer = new int[arr.length];
        Arrays.fill(answer, -1);
        answer[0] = arr[0];
        
        int count = 0;
        
        for(int i = 0; i < arr.length-1; i++){
            int preNum = arr[i];
            int postNum = arr[i+1];
            
            if(preNum != postNum) {count++;
                answer[count] = postNum;
            }
        }
        
        ArrayList<Integer> filteredList = new ArrayList<>();

        // -1이 아닌 값을 가진 요소들을 새로운 ArrayList에 추가
        for (int num : answer) {
            if (num != -1) {
              filteredList.add(num);
            }
        }

        // 새로운 배열에 복사
        int[] newArray = new int[filteredList.size()];
            for (int i = 0; i < filteredList.size(); i++) {
             newArray[i] = filteredList.get(i);
        }
        
        return newArray;
    }
}