1Page 노트정리 배열

1 Page 노트 정리

new repo

배열 (Array)

배열은 같은 타입의 변수들로 이루어진 집합입니다. 배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자는 인덱스(index)입니다. 배열의 인덱스는 0부터 시작해 0, 1, 2, 3, …, size - 1의 인덱스를 참조할 수 있습니다. 배열 A의 n번 째에 해당하는 변수는 A[n]으로 표시합니다.

배열 내 연산은 크게 접근(access), 검색(search), 추가(add), 제거(remove)으로 나뉩니다. 아래는 크기가 10인 Integer형 배열 예시입니다: int[] arr = new int[10];

  1. 접근 접근은 배열 내에서 n번째 인덱스에 해당하는 값을 찾아내는 연산입니다. 배열의 접근은 O(1)의 시간복잡도를 갖습니다. 따라서 찾고자 하는 값이 몇 번째 인덱스에 있는지 알고 있다면 굉장히 빠른 검색 속도를 갖습니다. 배열의 첫 번째 변수에는 시작 주소값이 저장되고, A[n]의 값을 찾아가기 위해 시작 주소값에서 단순 사칙연산이 수행되기 때문입니다.

  2. 검색 배열의 검색은 순차검색입니다. 인덱스를 알지 못할 때 원하는 값을 찾기 위해 배열을 하나하나 확인해야 합니다. 예를 들어 A[3]의 값을 찾기 위해 A[0], A[1]…을 순서대로 검색합니다. 따라서 최대 O(n)의 시간 복잡도를 가집니다.

  3. 추가와 삭제 추가와 삭제는 먼저 빈 공간이 마련되어 있음을 전제로 합니다. 추가와 삭제의 시간복잡도는 앞서 말한 접근과 검색의 방법 차이에 따라 나뉩니다. A[6]에 5라는 값을 넣거나 제거하고 싶을 때 해당 인덱스를 정확하게 알고 있다면 접근의 개념으로 O(1)의 시간복잡도를 가지지만, 해당 인덱스를 찾아야 한다면 검색의 시간복잡도인 O(n)에 해당합니다.

1. 배열 선언

배열은 같은 타입의 여러 값을 저장할 수 있는 자료구조입니다. 배열을 선언하고 초기화하는 방법은 다음과 같습니다:

int[] arr = {1, 3, 2, 4};

위 코드는 정수형 배열 arr을 선언하고, {1, 3, 2, 4} 값으로 초기화합니다.

2. 배열 정렬

배열을 정렬하는 방법에는 오름차순과 내림차순이 있습니다.

오름차순 정렬

오름차순으로 배열을 정렬하려면 Arrays.sort() 메서드를 사용합니다:

Arrays.sort(arr);

정렬 후 arr 배열은 [1, 2, 3, 4]가 됩니다.

내림차순 정렬

내림차순으로 배열을 정렬하려면 Arrays.sort(arr, Collections.reverseOrder()) 메서드를 사용합니다. 하지만 이 메서드는 Integer 배열에 대해서만 작동합니다. 따라서 int[] 배열을 Integer[] 배열로 변환해야 합니다:

Integer[] arr = {1, 3, 2, 4};
Arrays.sort(arr, Collections.reverseOrder());

정렬 후 arr 배열은 [4, 3, 2, 1]가 됩니다.

배열의 일부만 정렬

배열의 일부만 정렬할 수도 있습니다:

Arrays.sort(arr, 0, 3);

위 코드는 배열 arr의 0번 인덱스부터 2번 인덱스까지의 요소만 정렬합니다.

3. 배열 비교

배열을 비교하려면 Arrays.equals() 메서드를 사용합니다:

int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
boolean isEqual = Arrays.equals(arr1, arr2); // true

2차원 배열을 비교하려면 Arrays.deepEquals() 메서드를 사용합니다:

int[][] arr1 = { {1, 2}, {3, 4} };
int[][] arr2 = { {1, 2}, {3, 4} };
boolean isDeepEqual = Arrays.deepEquals(arr1, arr2); // true

4. 배열 출력

배열을 출력하려면 Arrays.toString() 메서드를 사용합니다:

System.out.println(Arrays.toString(arr)); // [1, 3, 2, 4]

2차원 배열을 출력하려면 Arrays.deepToString() 메서드를 사용합니다:

int[][] arr2 = { {1, 2}, {3, 4} };
System.out.println(Arrays.deepToString(arr2)); // [[1, 2], [3, 4]]

5. 문자열과 배열 간 변환

문자열을 char[] 배열로 변환

문자열을 char[] 배열로 변환하려면 toCharArray() 메서드를 사용합니다:

String s = "ABC";
char[] c = s.toCharArray(); // ['A', 'B', 'C']

char[] 배열을 문자열로 변환

char[] 배열을 문자열로 변환하려면 String 생성자를 사용합니다:

String str = new String(c); // "ABC"

문자열을 String[] 배열로 변환

문자열을 String[] 배열로 변환하려면 split() 메서드를 사용합니다:

String[] arr = s.split(""); // ["A", "B", "C"]

String[] 배열을 문자열로 변환

String[] 배열을 문자열로 변환하려면 String.join() 메서드를 사용합니다:

String answer = String.join("", arr); // "ABC"

필수 1문제

최소, 최대 성공

문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력

  • 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다.
  • 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다.
  • 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

  • 첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

예제

예제 입력 1

5
20 10 35 30 7

예제 출력 1

7 35
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ10818 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int[] numbers = new int[n];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            numbers[i] = Integer.parseInt(st.nextToken());
        }

        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;

        for (int i = 0; i < n; i++) {
            if (numbers[i] > max) {
                max = numbers[i];
            }

            if (numbers[i] < min) {
                min = numbers[i];
            }
        }

        System.out.println(min + " " + max);
    }
}
5
20 10 35 30 7
7 35

출처 : 백준, https://www.acmicpc.net/problem/10818

문제 설명

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

제한사항

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.

입출력 예

arr divisor return
[5, 9, 7, 10] 5 [5, 10]
[2, 36, 1, 3] 1 [1, 2, 3, 36]
[3, 2, 6] 10 [-1]

입출력 예 설명

입출력 예 #1

arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.

입출력 예 #2

arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.

입출력 예 #3

3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.

import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        // 결과를 저장할 리스트를 생성합니다.
        ArrayList<Integer> answerList = new ArrayList<>();
        
        // 배열의 각 요소를 순회합니다.
        for (int i = 0; i < arr.length; i++) {
            // 현재 요소가 divisor로 나누어 떨어지는지 확인합니다.
            if (arr[i] % divisor == 0) {
                // 나누어 떨어지면 answerList에 추가합니다.
                answerList.add(arr[i]);
            }
        }
        
        // 만약 answerList가 비어 있으면, 즉 나누어 떨어지는 요소가 없으면
        if (answerList.isEmpty()) {
            // [-1]을 담은 배열을 반환합니다.
            return new int[] {-1};
        }
        
        // 나누어 떨어지는 요소가 있으면 answerList를 정렬합니다.
        Collections.sort(answerList);
        
        // 정렬된 answerList를 배열로 변환합니다.
        int[] answer = new int[answerList.size()];
        for (int i = 0; i < answerList.size(); i++) {
            answer[i] = answerList.get(i);
        }
        
        // 최종 배열을 반환합니다.
        return answer;
    }
}

출처 : 프로그래머스, https://school.programmers.co.kr/learn/courses/30/lessons/12910

Leave a comment