yeoseon/tip-archive

[Java] 배열에 동적으로 길이 늘려서 원소 추가하기

yeoseon opened this issue · 1 comments

알고리즘을 풀다가.. (https://github.com/yeoseon/algorithm/blob/master/src/MockExam.java)
결과를 배열로 뱉어줘야 하는데 해당 결과 배열의 Size를 정해두지 않고 원소를 추가/삭제 하고 싶은데 어떻게 할까?

(Collection을 이용해서 배열에 하나씩 넣어주는 방식으로 사용한 방식은 안좋아보이지만 일단 그냥 넘기자..)
result의 길이를 3으로 정해버렸기에, {1, 0, 0} 과 같이 결과가 도출되어 에러가 났다. (원래 답: {1})

    private int[] getMaxCount(int count1, int count2, int count3) {
        int[] countResult = {count1, count2, count3};
        int[] result = new int[3];
        List<Integer> tempResult = new ArrayList<>();

        int maxCount = countResult[0];

        for(int i = 0; i < countResult.length; i++) {
            if(maxCount < countResult[i]) {
                maxCount = countResult[i];
            }
        }

        for(int i = 0; i < countResult.length; i++) {
            if(countResult[i] == maxCount) {
                tempResult.add(i + 1);
            }
        }

        int size = 0;
        for(int temp : tempResult) {
            result[size] = temp;
            size++;
        }
        return result;
    }

나는 이렇게..

temporary 배열과 System.copyArray를 이용해 해결했다..
풀이(getMaxCount 메소드) 참고

더 단순한 방법이 있었음..

Sample 코드 참고
Collection으로 처리 후에, 배열을 int[] res = new int[list.size()]; 다음과 같이 Collection의 Size만큼 크기로 만들어서 그냥 넣어주기만 하면 되었던 것. .. ㅎㅎ

Java 8의 Stream API를 이용한다.

        ArrayList<Integer> list = new ArrayList<>();
        if(maxScore == score[0]) {list.add(1);}
        if(maxScore == score[1]) {list.add(2);}
        if(maxScore == score[2]) {list.add(3);}
        return list.stream().mapToInt(i->i.intValue()).toArray();

Reference