코딩 테스트

[코딩테스트] 배열에서 원소 삭제하기(.feat C)

디벨로펄 2024. 2. 4.
반응형

귀중한 토요일 오후 시간을 바쳐서 4시간짜리 문제를 풀고 왔습니다.

1년 째 두달마다 한 번씩 시험을 치르고 있는데, C언어는 안쓰다보니 생각보다 구현에 시간이 많이 소요됩니다.

 

이번 시험에서는 이중 배열에서 원소를 삭제하려는데, 원하는 대로 동작하지 않아서...

그거 잡다가 시간을 다 날렸네요..

 

관련해서 이번 글은 아래와 같이 작성해보겠습니다.

1. 일차원 배열에서의 원소 삭제

2. 이차원 배열에서의 원소 삭제

 

일차원 배열에서의 원소 삭제

- 해당 원소 이후의 원소를 한 칸씩 당기기

- 배열의 크기 업데이트

일차원 배열에서 원소 삭제

#include <stdio.h>
#define ARRSIZE 10
// dIdx위치의 element를 지운다.
void deleteElementOneD(int arr[], int dIdx, int arrSize) {
	// 한 칸씩 당겨줍니다.
	for (int i = dIdx; i < arrSize-1; i++) {
		arr[i] = arr[i + 1];
	}
	arr[arrSize - 1] = 0; // 가장 마지막꺼 초기화...-> 테스트에서는 이 부분을 잘 해주지 못한듯.
}

int main() {
	int size = ARRSIZE;
	int arr[ARRSIZE] = { 1,2,3,4,5,6,7,8,9, 10 };
	
	for (int i = 0; i < size; i++) {
		printf("%d, ",arr[i]);
	}
	printf("\n");
	deleteElementOneD(arr, 5, ARRSIZE);
	size--;

	for (int i = 0; i < size; i++) {
		printf("%d, ", arr[i]);
	}
	printf("\n");

	return 0;
}

일차원에서는 값을 하나씩 당겨주면 되기 때문에 쉽게 처리할 수 있습니다.

 

이차원 배열에서의 원소 삭제 및 이차원 배열 주소

- 해당 원소 이후의 원소를 한 칸씩 당기기

- 배열의 크기 업데이트

 

아래 처럼 구현되었다고 생각했지만, 아니었습니다. ㅜ 

이런식으로 구현되었다고 생각했습니다만... 아니었음

일차원 배열처럼 구현하려고 하면 아래와 같은 오류가 발생합니다.

왼쪽에 값을 수정할 수 없다는 얘긴데요.. 이차원 배열을 생성한다 해도, 주소는 일차원으로 할당되기 때문입니다.

void deleteElementTwoD(int arr[][ARRSIZE], int dIdx, int size1, int arrSize[MAXSIZE]) {
	for (int i = dIdx; i < size1 - 1; i++) {
		arr[i] = arr[i + 1]; // <-여기서 에러 발생)
	}	
}
expression must be a modifiable lvalue

 

이차원 배열이 메모리 상에 올라간 상태

이차원 배열 메모리 할당

 

 

간단한 이차원 배열의 각 원소의 주소를 출력해보면 아래와 같습니다.

int 자료형의 크기가 4byte이므로, 4바이트씩 차이가 나는것을 볼 수 있습니다.

int twoD[3][2] = {
	{1,2},
	{3,4},
	{5,7}
};
for (int i = 0; i < 3; i++) {
    printf("%p\n", &(twoD[i]));
	for (int j = 0; j < 2; j++) {
		printf("%p, ", &(twoD[i][j]));
	}
	printf("\n");
}
00F3FC80 // towD[0]의 주소
00F3FC80, 00F3FC84 // towD[0][0], towD[0][1]의 주소
00F3FC88 // towD[1]의 주소
00F3FC88, 00F3FC8C // towD[1][0], towD[1][1]의 주소
00F3FC90 // towD[2]의 주소
00F3FC90, 00F3FC94 // towD[2][0], towD[2][1]의 주소

 

그래서, 원소를 한땀 한 땀 옮기는 것으로 재구현해보겠습니다.

이차원 배열의 삭제 최종구현

#include <stdio.h>
#define ARRSIZE 10
#define MAXSIZE 20

// dIdx위치의 element를 지운다.
void deleteElementTwoD(int arr[][ARRSIZE], int dIdx, int &size1, int arrSize[3]) {
	for (int i = dIdx; i < size1 - 1; i++) {
		for (int j = 0; j < arrSize[i]; j++) {
			arr[i][j] = arr[i + 1][0];
		}
		arrSize[i] = arrSize[i + 1]; // 행별 원소의 개수 조정.
	}
	arrSize[--size1]=0; // 행의 크기 조정.
}

int main() {
	int aSize = 3; // 전체 행의 개수
	int sizeTwoD[3] = { 3,2,1 }; //각 행별 원소의 개수
	int twoD[3][ARRSIZE] = {
		{1,2,3},
		{3,4},
		{5}
	};
	deleteElementTwoD(twoD, 1, aSize, sizeTwoD);
	
	for (int i = 0; i < aSize; i++) {
		for (int j = 0; j < sizeTwoD[i]; j++) {
			printf("%d, ", (twoD[i][j]));
		}
		printf("\n");
	}
	return 0;
}
----초기-------
1, 2, 3,
3, 4,
5,
----1행 삭제-------
1, 2, 3,
5,

 

생각대로 구현이 안돼서 당황했네요...ㅎㅎ

 

반응형

댓글