나다.
이 글이 뭐하는 글이냐면
프로그래머스 라는 사이트에 대해 알고있는가?
https://programmers.co.kr/ 다양한 문제를 풀어볼 수 있다. |
프로그래머스에서 문제를 풀다보면 int 타입의 배열을 반환하도록 요구하는 문제들을 만날 수 있다.
물론 반환 타입을 바꾼 후 같은 결과값을 가진 다른 반환 타입을 제출한다면 정답으로 인정하지만
그건 출제자의 의도와 맞지않다 생각해 난 처음 요구하는 타입을 맞춰 제출하는 편이다.
나는 무지성이다.
그래서 선언 할 때 사이즈를 정하는 int 배열을 사용하는 것 보다 List를 사용하여 답을 도출 한 후
List를 배열로 바꿔 제출하는 것을 선호하는 편이다.
이 방식을 몰랐던 응애가 아닌 정자 수준이였던 시절 나는 매일 생각했다.
아 X발 배열 크기 선언해주는거 X 같네.
혹시나 그런 사람들이 있다면 아래의 방법을 참고하면 좋을 듯 하다.
그렇다면 List를 int 배열로 바꾸는 방법에 대해 알아보자.
방법 1 (반복문)
반복문을 통해 집어넣는 방법이다.
List<Integer> list = new ArrayList<>();
list.add(~~~~~~);
// list에 필요한 값들 집어넣음.
int[] arr = new int[list.size()];
// 배열 안에 들어가는 값과 갯수는 어차피 list와 동일하다.
for(int i = 0; i < list.size() or arr.length(); i++{
arr[i] = list.get(i);
}
//arr[i]에 들어 갈 원소는 list의 i번째 인덱스와 같다.
return arr;
//결국 List와 똑같은 int 배열이 반환된다.
기본적으로 지금 안에 들어있는 List와 Array의 차이는 하나 밖에 없다.
List<Integer>냐 int[]냐 일 뿐이다.
그렇기 때문에 안에 들어갈 값과 갯수는 동일한 상태이니
반복문을 통해 순서대로 집어넣어주면 된다.
방법 2 (stream)
스트림의 mapToInt를 통해 변환하는 방법이다.
List<Integer> list = new ArrayList<>();
list.add(~~~~);
// 값들 집어넣음.
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
//메소드 참조방식
//또는
int[] arr = list.stream().mapToInt(i -> i).toArray();
//람다식 이용
// 두개 똑같음.
가독성도 좋고 간단하다.
나는 눈이 더 편한 람다식을 쓰는 것을 선호하는 편이다.
이 두 가지 방식으로 Integer List로 처리한 후 int[] 로 변경해 반환하면 된다.
한 줄이라도 더 줄이고 싶으면
return list.stream().mapToInt(i->i).toArray();
로 사용하셔도 될 듯.
반대의 경우
반대의 경우 또한 있을 수 있다.주어진 int 배열을 List로 바꿔 쓰고싶은 그런 때가 올 수 있다.
해바라기는 영화를 본 적이 있다면 이 대사를 기억 수도 있을 듯 하다.
"미분이 뭔지 아냐?
"적분 꺼꾸로"
"적분은"
"미분 꺼꾸로"
지금의 상황을 아주 잘 묘사한 띵대사가 아닐까한다.
만일 누군가 와서
정수를 몇 개를 더 집어넣어야 한다는데 배열 크기가 존X 작아. 그러니까 배열 크기좀 늘려줘.
라고 한다면 우리는 말할 것이다.
그래서 시X 정수가 도대체 몇개인데요.
몇 개인지 모를 정수를 추가할 때 사용해도 꽤 괜찮은 방법이 될 듯 하다.
방법 1 (반복문)
int[] arr = {1,2,3};
// 경영이형에게 배열을 할당받았다.
List<Integer> list = new ArrayList<>();
//List를 선언한다.
for(int i = 0; i < arr.length; i++){
list.add(arr[i]);
}
//List에 할당된 배열의 원소들을 넣는다.
//이제 갯수의 제한 없이 마음대로 정수를 집어넣을 수 있다.
List<Integer>를 int[]로 바꿨을 때와 정확히 거꾸로 돌아갔다.
방법 2 (stream)
int[] arr = {1,2,3,4};
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
자세한 작동방식에 대해서는 나중에 Collectors에 대해 다룰 때 기술하겠지만
일단 int타입의 배열을 Wapper type으로 box에 집어넣는다고 이해하면 편하겠다.
이렇게 기존의 배열 속 정수들을 List에 추가 한 후 임의의 정수들을 List에 집어넣고 다시
배열로 바꾼다면 정해지지 않은 일정 갯수의 정수를 그때그때 받아 추가 할 수 있다.
그래서 어떨 때 쓰냐면
한 개만 추가하고 싶으면
public int[] addNum(int[] arr, int n){
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
list.add(n);
int[] newArr = list.stream().mapToInt(i->i).toArray();
return newArr;
}
또는 배열에 다른 배열의 원소 모두를 집어넣고 싶다면
public int[] addNum(int[] arr, int[] target){
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
for(int t : target) {
list.add(t);
}
int[] newArr = list.stream().mapToInt(i->i).toArray();
return newArr;
}
정도면 될 듯 싶다.
나는 허접이기때문에 더 좋은 방법이 있다면 그 방법을 쓰길 권장드린다.
물론 나도 좀 알려주고...
좋은건 나눠쓰라는 말도 있지 않은가.
항상 컴파일 오류 없는 개발하시길... :)
'Java' 카테고리의 다른 글
[Java] HashMap이란 무엇인가. (5) | 2023.01.01 |
---|---|
[Java] String이란 무엇인가. (8) | 2022.12.31 |
[Java] int와 Integer의 차이 (4) | 2022.12.19 |
[JAVA] 다이아몬드 연산자가 뭐임? (1) | 2022.12.17 |