귀중한 토요일 오후 시간을 바쳐서 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,
생각대로 구현이 안돼서 당황했네요...ㅎㅎ
'코딩 테스트' 카테고리의 다른 글
[코딩테스트] Quick Sort(.feat C) (0) | 2024.02.03 |
---|---|
[LeetCode] 3. Longest Substring Without Repeating CharactersMedium - Medium (0) | 2023.02.15 |
[LeetCode] 2. Add Two Numbers - Medium (0) | 2023.02.15 |
[LeetCode] 1. Two Sum - Easy (0) | 2023.02.15 |
[프로그래머스] 디스크 컨트롤러 (0) | 2023.02.10 |
댓글