배열에서의 중복제거
⭐️ 함수를 사용하지 않고 중복 제거를 해보자
오늘은 문제를 풀다가 배열에서의 중복제거에 대한 문제를 직면했다.
아래는 여러 중복제거 방법중 하나를 선택해 문제를 풀어 보았다.
[중복제거 방법 ]
1. 간단하고 빠르게 처리하려면 Set 사용.
2. 메모리를 절약하려면 정렬 후 중복 제거.
3. 추가 자료구조 없이 처리하려면 직접 중복 확인.
4. Java 8 이상에서는 Stream API 사용으로 간결하게 구현.
중복제거 방법에는 크게 4가지가 있는데 , 3번인 직접 중복 확인을 통해 다음 문제를 풀어보겠다.
[문제]
2차원 배열에 들어있는 데이터들 중 3의 배수만 골라내서 새로운 1차원배열에 기록하고 출력한다.
단 중복 값은 하나만 기록되게 한다.
int [][] array = {{12, 41, 36, 56}, {82, 10, 12, 61}, {14, 16, 18, 78}, {45, 26, 72, 23}};
int[] copyAr = new int[array의 행갯수 * 열갯수];
[코드]
public static void main(String[] args) {
int[][] array = {
{12, 41, 36, 56},
{82, 10, 12, 61},
{14, 16, 18, 78},
{45, 26, 72, 23}
};
int[] copyAr = new int[array.length * array[0].length];
int index = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
//중복제거
if (array[i][j] % 3 == 0) {
boolean isDuplicate = false;
for (int k = 0; k < copyAr.length; k++) {
if (copyAr[k] == array[i][j]) {
isDuplicate = true;
break;
}
}
if (isDuplicate == false) {
copyAr[index++] = array[i][j];
}
}
}
}
for (int i = 0; i < index; i++) {
System.out.print(copyAr[i] + " ");
}
}
[중복제거 코드]
if (array[i][j] % 3 == 0) {
boolean isDuplicate = false;
for (int k = 0; k < copyAr.length; k++) {
if (copyAr[k] == array[i][j]) {
isDuplicate = true;
break;
}
}
if (isDuplicate == false) {
copyAr[index++] = array[i][j];
}
}
다음과 같이 3의 배수만 골라내는 과정에서 isDuplicate라는 boolean타입 변수를 생성해 중복제거
트리거를 만들어 보았다.
현재 2차원 배열을 출력하는 2중 for문 안에 또 for문이 들어간것이다.
풀이는 다음과 같다 .
1. array[i][j]를 for문이 돌면서 3의배수를 찾고 , 3의 배수이면 그 안에 for문을 돌면서
copyAr[k]번째 있는 값과 array[i][j]번째 있는 값이 같다면 isDuplicate를 true로 변경하고
break;를 이용하여 for문을 탈출하는 것이다.
2. 만약 중복된 숫자가 있다면 isDuplicate가 true가 되고 반복문을 빠져나와 중복된 값을 넣을 수
없게 되고 , 그렇지 않다면 (3의 배수가 아니라면) isDuplicate가 false인 경우인 if문을 만나
copyAr[index++] 번째 값에다가 array[i][j]값을 넣어주게 된다.
🧐 그런데 여기서 index++는 무엇일까 ?
int[] copyAr = new int[array.length * array[0].length];
int index = 0;
위에 copyAr을 선언하고 초기화하는 구문 아래 int index=0; 이라고 변수를 선어해 주었다.
이 변수를 선언한 이유는 2중 for문 안에서 copyAr 배열의 순서를 매길 수 없기 때문이다.
왜냐하면 바깥 for문은 array.length 즉 참조하고 있는 배열의 갯수(행의 길이)의 길이 ,
안쪽 for문은 1차원 배열의 크기 이기 때문에 copyAr의 길이를 정해줄 수 없다.
그렇기때문에 index라는 변수를 선언하고 중복제거 트리거를 통해 중복이 아닌경우에
arr[i][j]값을 받을때마다 1씩 증가할 수 있는 변수를 선언하여 문제를 풀 수 있게 되었다.
제공하는 함수를 사용하면 더 쉽게 사용할 수 있지만
초반에 본인이 만든 트리거를 이용해서 다양하게 방법을 알고
추후에 함수를 사용하면 함수의 편리함과 코드의 이해가 더 빨라질거 같다 ‼️