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

728x90

Q. 문제

배열 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보다 작거나 같은 정수

풀이 방법 1>  ArrayList를 이용하여 중복 원소 제거 

import java.util.ArrayList;
import java.util.List;

public class Problem7 {

    static int[] solution(int[] arr){

        List<Integer> list = new ArrayList<>();

        for(int i : arr)
            list.add(i);

        for(int i = 0; i < list.size()-1; i++){
            if(list.get(i) == list.get(i+1)){
                list.remove(i+1);
                i--; //배열요소 한개 작아져서 i도 감소시켜야 함
            }
        }


        int[] answer = new int[list.size()];
        for(int i = 0; i < answer.length; i++) //list.size로 했더니
            answer[i] = list.get(i);

        System.out.println("Hello Java");
        return answer;
    }

    public static void main(String[] args) {
    //테스트 코드입니다.
        int[] arr1 = {1,1,3,3,0,1,1};
        System.out.println();
        for(int i : solution(arr1))
            System.out.print(i + " ");
            
        int[] arr2 = {4,4,4,3,3};
        for(int i : solution(arr2))
            System.out.print(i + " ");
    }
}

ArrayList로 원소 삭제 시에  for문의 i 변수를 조심해야 한다. i의 값을 그대로 가져가면, 원하는 결과가 나오지 않을 수 있다. (테스트 케이스에 따라 달라질 것이다..) 

하지만 결과는

정확도는 100%가 나왔지만, 효율성이 0% 가 나왔다.. 

효율성에서 늘 약한 모습을 보였는데... 역시나는 역시 '나'였다. 

for문을 많이 사용한것이 효율성에 영향을 미쳤다고 생각했다. 

 

 

풀이가 떠오르지 않아 구글링을 하였다. (참조 : https://jhnyang.tistory.com/131 )

 

[프로그래머스 LEVEL 1] 같은 숫자는 싫어 문제 해설 및 오답 풀이, 연속된 수 제거

백준이 아무래도 기초부터 풀기에는 쉬운 문제가 많아서 백준 문제부터 해설하려고 했는데.. 단점이 너무 질려 ㅠㅠㅠㅠㅠ 고러므로 오늘은 프로그래머스의 문제를 풀이하겠습니다.ㅎㅎ [Level 1] 같은 숫자는 싫..

jhnyang.tistory.com

 

풀이 방법이 3가지를 제시하였다. 

1) ArrayList에 주어진 배열의 값을 저장하면서 동시에 중복 내용을 검토

2) 먼저 중복된 개수를 파악하여 return 될 배열의 크기를 파악한 뒤에 그 배열에 중복되지 않은 원소들을 저장하는 방법

3) StringBuilder 이용한 (신박한) 풀이 

 

1), 2) 의 경우 쉽게 접근할 수 있을 것이라 생각하여 3) 번 풀이의 내용을 가져왔다.

public class Solution {

    static int[] solution(int[] arr) {


        StringBuilder sb = new StringBuilder();
        int size = arr.length;
        sb.append(arr[0]);
        for(int i = 1; i < size; i++){
            if(arr[i-1] != arr[i]) sb.append(arr[i]);
        }
        String[] array = sb.toString().split("");
        size = array.length;
        int[] answer = new int[size];
        for(int i = 0; i < size; i++){
            answer[i] = Integer.parseInt(array[i]);
        }
        return answer;
    }
}

 나의 풀이와 비교했을 때  for문 사용 횟수도 줄고, ArrayList도 사용하지 않았다. (배열의 크기 변화 x)

이전에  String, StringBuffer, StringBuilder  이 3가지의 차이에 대해서 공부했었는데, 오래전에 공부한 것이라 잘 기억이 안 나서 

문자열을 수정할 때 String으로 수정하면 더 많은 메모리를 사용하게 된다는 내용이었던 거 같다. 

다음 포스팅 때에는 String, StringBuilder, StringBuffer의 차이점에 대해서 공부하기로 여기서 다짐해본다.

728x90