[99클럽 코테 스터디_ DAY 7] 같은 숫자는 싫어

yewon·2024년 7월 28일
0

스터디

목록 보기
7/22
post-thumbnail
post-custom-banner

같은 숫자는 싫어

✏️오늘의 문제



💡나의 풀이


      public int[] solution(int []arr) {
		        int j=0;
		        for(int i =1; i<arr.length; i++){
		            if(arr[j]==arr[i]){
		                arr[j]= 10;
		            } 
		            j++;
		        }
		        int count = (int)Arrays.stream(arr).filter(e -> e!=-1).count();
		         int[] answer = new int[count];

		        j=0;

		       for(int i=0 ; i<arr.length; i++){
		            if(arr[i]!=10){
		                answer[j] = arr[i];
		                j++;
		            }
		       }

		        return answer;
		    }

이 코드에는 문제점이 있습니다.

  1. 인덱스 초과 문제

    • j++가 반복문에서 매번 증가하기 때문에, jarr.length에 도달할 경우 인덱스 초과 오류가 발생할 수 있습니다. j는 중복되지 않은 값의 인덱스를 관리해야 하므로, 중복된 값이 아닐 때만 증가해야 합니다.
  2. 필터링 로직

    • 배열에서 값이 10인 요소를 필터링하여 새로운 배열을 만드는 과정에서, 만약 배열에 10이 존재하지 않으면 잘 동작할 수 있지만, 배열의 원래 값을 변경하는 것이 좋지 않습니다. 배열을 직접 수정하기보다는 새로운 배열을 만드는 것이 더 안전합니다.
  3. 반환 값의 정확성

    • 중복을 제거한 후의 배열 크기를 정확하게 계산하는 것이 필요합니다. 현재 코드에서는 중복을 제거한 후의 크기를 제대로 반영하지 못할 수 있습니다.

💡문제점 개선 풀이

public int[] solution(int[] arr) {
    if (arr.length == 0) return new int[0]; // 빈 배열 처리

    int[] temp = new int[arr.length];
    int j = 0;

    for (int i = 0; i < arr.length; i++) {
        // 첫 번째 값 또는 이전 값과 다를 경우에만 추가
        if (i == 0 || arr[i] != arr[i - 1]) {
            temp[j] = arr[i];
            j++;
        }
    }

    return Arrays.copyOf(temp, j); // 유효한 부분만 복사하여 반환
}

이 코드는 중복된 값을 제거하고 새로운 배열을 생성하여 반환합니다. temp 배열을 사용하여 중복이 아닌 값을 저장하고, 최종적으로 필요한 크기만큼 복사하여 반환합니다.



💡다른 사람의 풀이


 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. ArrayList 선언

    • tempList라는 ArrayList를 생성하여 중복되지 않은 값을 저장합니다.
  2. 이전 숫자 초기화

    • preNum 변수를 초기화하여, 비교할 기준이 되는 값을 설정합니다.
  3. 중복 제거 로직

    • 주어진 배열 arr를 순회하며, 현재 숫자 num이 이전 숫자 preNum과 다를 때만 tempList에 추가합니다.
    • 이후 preNum을 현재 숫자로 업데이트하여 다음 반복에서 비교합니다.
  4. 결과 배열 생성

    • tempList의 크기를 기반으로 새로운 정수형 배열 answer를 생성합니다.
    • tempList의 각 요소를 answer 배열에 복사합니다.
  5. 결과 반환

    • 최종적으로 중복이 제거된 배열을 반환합니다.

결론

이 알고리즘은 간단하면서도 효과적으로 연속된 중복 값을 제거할 수 있습니다. Java의 ArrayList를 활용하여 동적으로 중복되지 않은 값을 저장하고, 최종적으로 배열로 반환하는 방식으로 구현되었습니다. 이를 통해 여러분의 데이터 처리 과정에서 중복 제거가 필요할 때 유용하게 사용할 수 있습니다.


💡다른 사람의 풀이 2


public ArrayList<Integer>solution(int []arr) {
		        ArrayList<Integer> tempList = new ArrayList<Integer>();
		        int preNum = 10;
		        for(int num : arr) {
		            if(preNum != num)
		                tempList.add(num);
		            preNum = num;
		        }       
		        return tempList;
		    }

코드 동작 원리

  1. ArrayList 선언

    • tempList라는 이름의 ArrayList를 생성합니다. 이 리스트는 중복되지 않은 값을 저장하는 데 사용됩니다.
  2. 이전 숫자 초기화

    • preNum 변수를 초기화하여 비교할 기준이 되는 값을 설정합니다. 이 예제에서는 10으로 초기화하였으며, 이는 배열의 요소와 겹치지 않는 값입니다.
  3. 중복 제거 로직

    • for-each 루프를 사용하여 arr 배열의 각 요소를 순회합니다.
    • 현재 요소 num이 이전 요소 preNum과 다를 경우, 즉 연속된 중복이 아닐 경우 tempListnum을 추가합니다.
    • 이후 preNum을 현재 num으로 업데이트하여 다음 반복에서 비교할 수 있도록 합니다.
  4. 결과 반환

    • 최종적으로 중복이 제거된 값을 담고 있는 tempList를 반환합니다.


post-custom-banner

0개의 댓글