기기

[ 프로그래머스 ] 같은 숫자는 싫어 ( java ) 본문

CS/알고리즘 풀이

[ 프로그래머스 ] 같은 숫자는 싫어 ( java )

notEmpty 2019. 12. 4. 19:54

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

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

ex) arr = [1, 1, 3, 3, 0, 1, 1]  ->  [1, 3, 0, 1] 리턴 

 

 

https://programmers.co.kr/learn/courses/30/lessons/12906

 

코딩테스트 연습 - 같은 숫자는 싫어 | 프로그래머스

배열 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] 을 retur

programmers.co.kr

 

 

 

구조 1

pre = 인풋으로 나올 수 없는 정수 

for( cur: 모든 arr  )

    pre 와 cur가 다르면? curans에 추가 

    pre = cur

 

구조 2

pre = arr[0]

for ( cur: 첫 번째를 제외한 모든 값 ) 

    pre와 cur가 다르면 -> preans에 추가 

    pre = cur

if ans가 비었거나, ans의 마지막 값과 arr마지막이 다르면 -> ansarr마지막 추가

 

 

핵심 

연속 중복을 제거

  1. 현재 값 cur와 중복 처리해야 하는 cur 이전 값 pre를 사용. 
  2. cur와 pre가 달라질 때, cur 또는 pre 중 하나를 기준으로 중복 처리한다. 

    - cur 기준 시, pre는 인풋으로 절대 나올 수 없는 값으로 초기화.
    - pre 기준 시, 인풋의 마지막 (연속) 값을 루프 끝나고 처리해야 한다. 

    루프 끝나고 따로 처리해줘야 한다. 단, 모두 한 가지 숫자인 경우를 고려 안 하면 틀림. 
    cur기준이 깔끔하고 좋지만, 어쩔 수 없이 pre기준을 해야 할 때가 있다. 

 

 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;
 
public class Solution {
    public int[] solution(int []arr) {
       ArrayList<Integer> list = new ArrayList<Integer>();
        int pre = -1, cur;
        for(int i = 0 ; i < arr.length ; i++) {
            cur = arr[i];
            if(pre != cur) {
                list.add(cur);
            }
            pre = cur;
        }
        int[] ans = new int[list.size()];
        for(int i = 0 ; i < list.size() ; i++) {
            ans[i] = list.get(i);
        }
        return ans;
    }
}
cs