언어/java
선형자료구조 - 배열
Eprld
2025. 3. 12. 17:49
선형 자료구조
자료구조(Data Structure)
-자료를 효율적으로 관리하기 위한 구조
-목적에 맞게 사용한 좋은 자료구조는, 실행시간 단축 or/and 메모리 용량 절감 효과가 있다.
자료구조의 분류
-선형 자료구조 : 배열, 연결리스트, 스택, 큐, 데크, 해시 테이블
-비선형 자료구조 : 트리, 그래프, 힙/우선순위 큐, 트라이
자료구조의 구현
-추상 자료형
자료 형태와 자료에 대한 연산을 정의한 것
구체적인 구현 방법은 명시하지 않음
배열(Array)
-많은 수의 데이터를 다룰 때 사용하는 자료구조
-각 데이터를 인덱스와 1:1 대응하도록 구성
-데이터가 메모리 상에 연속적으로 저장됨
배열의 장점
-인덱스를 잉요하여 데이터에 빠르게 접근 가능
배열의 단점
-데이터의 추가/삭제가 번거로운 편
-미리 최대 길이를 정해서 생성해야 함
-가변 길이 배열은 배열의 크기를 변경할 때마다 새로운 배열을 생성
-데이터 삭제 시, 인덱스를 유지하기 위한 빈 공간 유지
1차원 배열
//1차원 배열
System.out.println("1차원 배열");
int[] arr = {1,2,3,4,5};
for(int item : arr) {
System.out.println("item = " + item);
}
arr[1] = 100;
System.out.println(Arrays.toString(arr));
2차원 배열
//2차원 배열
System.out.println("2차원 배열");
int[][] arr2 = {{1,2,3}, {4,5,6}};
System.out.println(arr2[0][1]);
for(int[] row:arr2) {
for(int item : row) {
System.out.println("item = " + item);
}
}
//ArrayList - 1차원, 2차원
System.out.println("== ArrayList ==");
ArrayList list1 = new ArrayList(Arrays.asList(1,2,3));
System.out.println(list1);
list1.add(4);
list1.add(5);
System.out.println("list1 = " + list1);
list1.remove(2);
System.out.println("list1 = " + list1);
list1.remove(Integer.valueOf(2));
System.out.println("list1 = " + list1);
배열의 데이터 삽입
//배열의 데이터 삽입
public void insertData(int index,int data){
if(index < 0 || index > this.arr.length){
System.out.println("index Error");
return;
}
int[] arrDup = this.arr.clone();
this.arr = new int[this.arr.length + 1];
for(int i = 0; i < index; i++){
this.arr[i] = arrDup[i];
}
for(int i = index; i < this.arr.length; i++){
this.arr[i] = arrDup[i - 1];
}
this.arr[index] = data;
}
배열의 데이터 삭제
//배열에서 특정 데이터 삭제
public void removeData(int data){
int targetIndex = -1;
for(int i = 0; i < this.arr.length; i++){
if(this.arr[i] == data) {
targetIndex = i;
break;
}
}
if(targetIndex == -1){
System.out.println("targetIndex Error");
}else{
int[] arrDup = this.arr.clone();
this.arr = new int[this.arr.length - 1];
for(int i = 0; i < targetIndex; i++){
this.arr[i] = arrDup[i];
}
for(int i = targetIndex; i < this.arr.length; i++){
this.arr[i] = arrDup[i + 1];
}
}
}
연습 문제1
배열 arr의 모든 데이터에 대해서 짝수 데이터들의 평균과 홀수 데이터들의 평균을 출력
public class Main {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
float sumEven = 0;
float sumOdd = 0;
int evenCount = 0;
int oddCount = 0;
for(int item : arr){
if(item % 2 == 0){
sumEven += item;
evenCount++;
}else {
sumOdd += item;
oddCount++;
}
}
System.out.println("Even AVG : " + sumEven / evenCount);
System.out.println("Odd AVG : " + sumOdd / oddCount);
}
}
연습문제 2
배열 arr에서 target에 해당하는 값의 인덱스를 출력 해당 값이 여러 개인 경우 가장 큰 인덱스 출력
해당 값이 여러 개인 경우 가장 큰 인덱스 출력
public class Main {
public static void main(String[] args) {
int [] arr ={1,1,100,1,1,1,100};
int target = 100;
int idxMax = -1;
for(int i =0; i<arr.length; i++){
if(arr[i] > target){
if(i > idxMax){
idxMax = i;
}
}
}
if(idxMax >= 0){
System.out.println(idxMax);
}
}
}
연습문제 3
배열 arr의 데이터 순서를 거꾸로 변경
추가 배열을 사용하지 않고 구현
public class Main {
public static void main(String[] args) {
int[] arr = {1,3,5,7,9};
for(int i = 0; i <arr.length / 2; i++) {
int tmp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = tmp;
}
System.out.println(Arrays.toString(arr));
}
}
연습문제 4
배열 arr 에서 peek값 모두 출력
public class Main {
public static void main(String[] args) {
int[] arr = {3,1,2,6,2,2,5,1,9,18,1,11};
for(int i = 0; i<arr.length; i++) {
if(i == 0 && arr[i] > arr[i + 1]){
System.out.println(arr[i + 1] + "");
}else if(i == arr.length - 1 && arr[i] > arr[i - 1]){
System.out.println(arr[i] + "");
}else{
if(arr[i] > arr[i - 1] && arr[i] > arr[i + 1]){
System.out.println(arr[i] + "");
}
}
}
System.out.println();
}
}