TIL
오늘 푼 문제
- 코딩 테스트 고득점 kit 에서 깊이/너비우선탐색이랑 해시, 완전탐색 하고 있음
- 타겟 넘버 Lv2
- 네트워크 Lv2
- 게임 맵 최단거리 Lv2
- 단어 변환 Lv3
자바 배열에 새 요소 추가하는 거 코드
(1) System.arraycopy 이용
class Solution {
public static int[] addElement(int[] original, int newValue) {
int n = original.length;
int[] newArray = new int[n + 1]; // 기존 배열보다 1개 더 큰 새 배열 생성
System.arraycopy(original, 0, newArray, 0, n); // 기존 배열 복사
newArray[n] = newValue; // 새로운 원소 추가
return newArray;
}
}
더 큰 배열을 만들어서 기존 배열을 복사하고 새로운 원소 추가
(2) Arrays.copyOf
import java.util.Arrays;
class Solution {
public static int[] addElement(int[] original, int newValue) {
int[] newArray = Arrays.copyOf(original, original.length + 1); // 기존 배열에서 크기를 1 증가시킨 배열 생성
newArray[original.length] = newValue; // 새로운 요소 추가
return newArray;
}
}
(3) ArrayList 활용
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public static int[] addElement(int[] original) {
ArrayList<Integer> dynamicArray = new ArrayList<>(Arrays.asList(original));
dynamicArray.add(4);
return dynamicArray;
}
}
- 반면 동적 배열은, ArrayList의 내장함수인 add()를 활용하여 쉽게 원소를 추가할 수 있다.
어떤 방식을 쓰는 게 효율적인가?
1️⃣ System.arraycopy() 이용
- 전통적인 방법이고, 추가적인 객체 생성이 필요 없다.
- 배열 크기를 변경할 때마다 새 배열을 생성해야 하므로 추후에 또 배열 크기를 변경할 일이 있다면 성능 부담이 있다.
2️⃣ Arrays.copyOf() 이용
- 내부적으로 System.arraycopy() 를 호출하므로 1번과 성능이 거의 동일하다. (호출 과정에서 아주 약간의 오버헤드)
- 코드는 1번보다 직관적이다.
- 마찬가지로 배열 크기를 변경할 때마다 새 배열을 생성해야 한다.
3️⃣ ArrayList 활용
- 배열을 추가하는 과정이 편리한 대신 메모리 사용량이 증가한다.
- 여러 번 요소를 추가할 일이 있을 때 적합하다.
정리하면, 1번과 2번의 성능은 비슷하고 ( 배열을 복사하는 O(N) 연산 )
3번은 메모리 효율성이 떨어지는 대신 배열 크기가 계속 변해야 한다면 3번을 쓰는 게 편하다.
정리
✔ 속도 & 메모리 최적화가 필요하면 System.arraycopy()
✔ 가독성과 유지보수를 생각하면 Arrays.copyOf()
✔ 유연한 크기 변경이 필요하면 ArrayList