[99클럽 코테 스터디] 7일차 TIL - 같은 숫자는 싫어

Hoxy?·2024년 7월 28일
0

99클럽 코테 스터디

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

오늘의 학습 키워드

  • 같은 숫자는 싫어

공부한 내용 본인의 언어로 정리하기

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        List<Integer> unique = new ArrayList<>(); //중복제거완료 목록
        
        //첫번째 항목 추가
        unique.add(arr[0]); 
        //이전 개체와 비교하여 다를경우 unique 리스트에 추가
        for(int i =1; i < arr.length; i++)
            if(arr[i] != arr[i-1]){
                unique.add(arr[i]);
                }
        
        //배열로 반환하기 위한 새 배열 객체 생성
        int[] answer = new int[unique.size()];
        
        //리스트의 값을 배열로 전환
        for(int i = 0; i < unique.size(); i++){
            answer[i] = unique.get(i);
        }

        return answer;
    }
}

오늘의 회고

오늘의 문제는 어제 풀었던 "폰켓몬" 문제와 유사한 점이 아주 많았다.
어제 이미 중복된 개체를 제거하는데 사용된 코드를 똑같이 사용하면 되겠다고 생각해 진행했다.
어제와는 다르게 원래 있던 배열의 순서에서 중복된 개체만 제거해서 반환을 해야했기 때문에 오름차순 정렬은 제외하였다.

List<Integer> unique = new ArrayList<>(); //중복제거완료 목록
        

unique.add(arr[0]);  //첫번째 항목 추가

for(int i =1; i < arr.length; i++) { //이전 개체와 비교하여 다를경우 unique 리스트에 추가
    if(arr[i] != arr[i-1]){
       unique.add(arr[i]);
	}
}

이후 unique리스트를 그대로 반환하려고 했더니 Listint[]로 변환되지 않았다는 오류가 있었다.

그래서 List를 배열로 변환하는 작업이 필요했다.

int[] answer = new int[unique.size()]; //배열로 반환하기 위한 새 배열 객체 생성
        
for(int i = 0; i < unique.size(); i++){ //리스트의 값을 배열로 전환
	answer[i] = unique.get(i);
}

마지막 배열을 반환해주면 완성된다.

return answer;

AI 코드리뷰

Java 솔루션 코드 리뷰: 연속 중복 제거

전반적인 평가

  • 이 코드는 주어진 정수 배열에서 연속된 중복 요소를 제거하는 기능을 잘 구현하고 있습니다.
  • 알고리즘은 간단하고 효율적이며, 코드는 전반적으로 깔끔하고 이해하기 쉽습니다.

장점:

  • 알고리즘의 효율성: O(n) 시간 복잡도로 배열을 한 번만 순회하여 문제를 해결합니다.
  • 명확한 주석: 각 단계에 대한 한국어 주석이 잘 작성되어 있어 코드의 의도를 이해하기 쉽습니다.
  • 적절한 자료구조 사용: ArrayList를 사용하여 동적으로 크기가 조절되는 리스트를 만들었습니다.

개선 가능한 부분:

  • 입력 유효성 검사: 입력 배열 arr가 비어있는 경우에 대한 처리가 없습니다. 이를 추가하면 좋을 것 같습니다.
  • 변수명 개선: unique라는 변수명은 적절하지만, answer는 조금 더 구체적인 이름(예: result 또는 deduplicatedArray)으로 바꾸면 좋을 것 같습니다.
  • 스트림 API 활용: Java 8 이상을 사용한다면, 스트림 API를 활용하여 코드를 더 간결하게 만들 수 있습니다.
  • 불필요한 형변환 제거: ArrayList에서 배열로 변환하는 과정을 toArray() 메소드를 사용하여 간소화할 수 있습니다.

개선된 코드 제안

import java.util.*;
import java.util.stream.IntStream;

public class Solution {
    public int[] solution(int[] arr) {
        if (arr == null || arr.length == 0) {
            return new int[0];
        }
        
        return IntStream.range(0, arr.length)
                        .filter(i -> i == 0 || arr[i] != arr[i-1])
                        .map(i -> arr[i])
                        .toArray();
    }
}

개선된 버전의 장점:

  • 입력 배열의 유효성을 검사합니다.
  • 스트림 API를 사용하여 코드를 더 간결하고 함수형 스타일로 작성했습니다.
  • 중간 리스트 생성 없이 직접 결과 배열을 생성합니다.

원래의 코드도 문제를 잘 해결하고 있지만, 위에서 제안한 개선 사항들을 적용하면 더 견고하고 현대적인 Java 코드가 될 것입니다. 전반적으로 잘 작성된 코드입니다.

내일 공부할 것 :

AI의 말처럼 견고하고 현대적인 코드를 이용하기 위해서 Stream API를 사용하는 방법을 알아야겠다.

문제

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

profile
하나부터 열까지 모든 것이 궁금한 개발자 취준생
post-custom-banner

0개의 댓글