같은 숫자는 싫어_Java

컴투루·2022년 6월 28일
0

프로그래머스 Lv.1

목록 보기
22/38

연습문제

🔥 같은 숫자는 싫어 🔥


👀 문제

배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져있다.
이때 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 한다.
단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야한다.
배열 arr에서 연속적으로 나타는 숫자는 제거하고 남은 수들을 return하는 solution을 완성해보자.


✔️ 조건

  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

👩‍💻 입력 & 🧙 출력

arrreturn
[1,1,3,3,0,1,1][1,3,0,1]
[4,4,4,3,3][4,3]

🙋‍♀️ 첫번째 풀이

import java.util.*;
import java.util.stream.Collectors;


public class Solution {
    public int[] solution(int []arr) {
        
        //배열을 리스트로
        List<Integer> list = Arrays.stream(arr)
                                        .boxed()
                                        .collect(Collectors.toList());
        
        for(int i=0;i<list.size()-1;i++){
            if(list.get(i) == list.get(i+1)){        
                list.set(i,-1);
            }
            
        }
        
        //리스트를 배열로
        int[] answer = list.stream()
                            .filter(i -> i != -1)
                            .mapToInt(i -> i)
                            .toArray();
        

        return answer;
    }
}

처음 풀때는 너어무 복잡하게 돌아돌아갔다.
굳이 list를 사용하지 않아도 되는데 배열을 list로 변경하고 또 list를 배열로 변경하는 불필요한 일을 했다.

위의 코드로는 효율성테스트를 통과하지 못했다...

🙋‍♀️ 두번째 풀이

import java.util.*;


public class Solution {
    public int[] solution(int []arr) {
                
        for(int i=0;i<arr.length-1;i++){
            if(arr[i] == arr[i+1]){     
                arr[i] = -1;
            }
        }
        
        int[] answer = Arrays.stream(arr)
                            .filter(i -> i != -1)
                            .toArray();

        return answer;
    }
}
  1. 배열 arr의 길이만큼 반복문을 돌리면서 만약 arr의 i번째와 i+1번째의 값이 같다면 arr의 i번째의 값을 -1로 변경한다.
  2. stream의 filter를 이용해서 -1을 가진 값을 제외하고 answer에 대입해서 return한다.

놀랍게도 통과❗️

메모리: 113 MB, 시간: 34.41 ms

뭔가 실행시간이 너무 오래 걸린것 같지만 스스로 해결하다니 뿌듯!


💬 다른 풀이

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        ArrayList<Integer> tempList = new ArrayList<Integer>();
        int preNum = 10;
        for(int num : arr) {
            if(preNum != num)
                tempList.add(num);
            preNum = num;
        }       
        int[] answer = new int[tempList.size()];
        for(int i=0; i<answer.length; i++) {
            answer[i] = tempList.get(i).intValue();
        }
        return answer;
    }
}
  1. Integer형의 list tempList를 선언하고 int형 preNum을 10으로 선언한다.
  2. arr만큼 반복문을 돌면서 그 요소로 num을 받고 만약 preNum이 num과 같지 않다면 tempList에 num의 값을 추가해준다.
    그리고 preNum에 num을 대입해준다.
    preNum을 이용해서 중복되는 값을 제외하고 tempList에 넣어준것이다.
  3. list를 int의 배열로 변환해주고 return한다.

왜 preNum을 이용할 생각을 못했을까
제일 먼저 떠올린 방법이기는 하지만 두번째 입출력 예시의 경우에 출력이 [4,4,3]이 나오면서 3번 중복되는 값을 제거하지 못해서 포기했는데❗️❗️

메모리: 117 MB, 시간: 26.64 ms


👏 마무리

포기하지 말고 좀 더 생각해보자...

profile
맘 먹으면 못할 게 없지

0개의 댓글