코딩테스트/자료구조

1. 일반 배열(int[ ]) 사용법 (기본타입, 객체 배열)

초코chip 2024. 4. 12. 15:17

개념

  • 값 접근(읽기): O(1) - 인덱스를 사용하여 바로 접근 가능
  • 값 삭제/삽입: O(n) - 주변에 있는 값들을 옮겨주는 오버헤드 발생

일반 배열

연산 종류 정리

  • 생성
  • 값 접근(읽기)
  • 값 삽입, 삭제: 일반 배열로 감히 삽입,삭제를 할 생각하지 마라
  • 배열 길이: arr.length
  • 배열 최대,최소: Arrays.stream(arr).max().orElse(-1);
  • 배열 전체 초기화: Arrays.fill(arr,1);
  • 베열 전체 출력: Arrays.toString(arr)
  • 배열 정렬: Arrays.sort(arr)

배열 생성

//배열 선언
int[] test = new int[n];

//배열 선언 및 초기화
int[] test = {1,2,3};

배열 길이

int[] arr = new int[n];

arr.length

배열 최대/최소

java.util.Arrays 클래스 활용

int[] arr = {1, 2, 3, 4, 5};
int max = Arrays.stream(arr).max().getAsInt();
int min = Arrays.stream(arr).min().getAsInt();

배열 전체 초기화

int[] arr = new int[10];

// 배열을 1로 채움
Arrays.fill(arr, 1);

배열 전체 출력

java.util.Arrays클래스 함수 이용

int[] score = {12,3,4,5,6,7};

System.out.println(Arrays.toString(score));
//결과: [12, 3, 4, 5, 6, 7]

배열 정렬

java.util.Arrays클래스 함수 이용

+ 내림차순은 그냥 일반 배열 사용하지 말자

//오름차순 정렬 -> [0,1,2,3,4]
int[] arr = { 3,2,0,1,4 };
Arrays.sort(arr);

//내림차순 정렬 (주의! Wrapper클래스여야만 아래 방식 이용 가능)
// -> [4,3,2,1,0]
Integer[] arr2 = new int[n];
Arrays.sort(arr2, Comparator.reverseOrder())

// 배열 일부부만 정렬 (s ~ e-1까지 정렬)
int[] arr = { 3,2,0,1,4 };
Arrays.sort(arr, 0, 3); // 배열 요소 0, 1, 2 만 정렬 -> > [0, 2, 3, 1, 4]

 

객체 배열

일반 타입이 아닌 객체를 배열에 넣는 경우 아래 연산 사용 방법이 달라진다.

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Person[] people = new Person[3];
people[0] = new Person("John", 30);
people[1] = new Person("Alice", 22);
people[2] = new Person("Bob", 25);

 

연산 종류

  • 배열 전체 출력: Arrays.toString(array) + toString() 오버라이딩
  • 객체 비교 방법 추가: Comparable 인터페이스 구현 or Comparator 제공 or Comparator 람다식 제공
    • 배열 최대,최소: Arrays.stream(array).max(comparator).orElse(null), Arrays.stream(array).min(comparator).orElse(null)
    • 배열 정렬: Arrays.sort(array, comparator)

 

배열 전체 출력

클래스에서 toString() 메서드에 대해서 오버라이딩을 해야한다.

class Person {
    @Override
    public String toString() {
        return name + ": " + age;
    }
}

Person[] people = new Person[3];
people[0] = new Person("John", 30);
people[1] = new Person("Alice", 22);
people[2] = new Person("Bob", 25);

System.out.println(Arrays.toString(people));
// 결과: [John: 30, Alice: 22, Bob: 25]

 

객체 비교 방법 추가

Comparable 인터페이스 구현 및 compareTo 메서드 오버라이딩

  • 객체 내부에서 자체적으로 비교 가능
  • 해당 방법을 사용하면 일반 자료형에서 사용한 방법과 동일하게 사용 가능
class Person implements Comparable<Person> {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person other) {
        return this.age - other.age;  // 나이를 기준으로 오름 차순 비교
    }
}

 

Comparator 구현 및 compare 메서드 오버라이딩

  • 정렬 기준을 외부에서 전달하는 방법
class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.age - p2.age; //오름차순 비교
    }
}

배열 최대, 최소

최대, 최소를 구할 때는 오름차순, 내림차순 관계 없이 결과가 동일하게 나옴

Person[] people = new Person[3];
people[0] = new Person("John", 30);
people[1] = new Person("Alice", 22);
people[2] = new Person("Bob", 25);

// 구현한 것 전달
Person youngest = Arrays.stream(people).min(new AgeComparator()).orElse(null);
Person oldest = Arrays.stream(people).max(new AgeComparator()).orElse(null);

// 람다식 사용
Person youngest = Arrays.stream(people).min((p1, p2) -> p1.age - p2.age).orElse(null);
Person oldest = Arrays.stream(people).max((p1, p2) -> p1.age - p2.age).orElse(null);

 

배열 정렬

// 나이에 따라 오름차순 정렬
Arrays.sort(people, (p1, p2) -> p1.age - p2.age);

// 나이에 따라 내림차순 정렬
Arrays.sort(people, (p1, p2) -> p2.age - p1.age);