[알고리즘] 07. 배열과 인덱스 처리
지난 글에서는 알고리즘 문제 풀이 순서에 대해 정리했습니다. 이번 글부터는 알고리즘 문제에서 가장 자주 등장하는 기초 구현 영역으로 들어갑니다.
그 첫 번째 주제는 배열과 인덱스입니다. 배열은 여러 개의 값을 한 번에 다룰 수 있는 가장 기본적인 자료구조입니다.
배열은 같은 종류의 데이터를 순서대로 저장하는 공간이고, 인덱스는 그 위치를 가리키는 번호입니다.
1. 배열이란?
배열은 여러 개의 값을 하나의 이름으로 관리할 수 있게 해주는 자료구조입니다. 예를 들어 학생 5명의 점수를 저장해야 한다고 생각해보겠습니다.
배열을 사용하지 않으면 변수를 여러 개 만들어야 합니다.
int score1 = 80;
int score2 = 90;
int score3 = 70;
int score4 = 85;
int score5 = 95;
값이 5개 정도라면 괜찮아 보일 수 있지만, 100개나 1,000개가 된다면 관리하기 어렵습니다. 이럴 때 배열을 사용하면 여러 값을 하나의 변수로 묶어서 다룰 수 있습니다.
int[] scores = {80, 90, 70, 85, 95};
이렇게 하면 scores라는 배열 안에 여러 개의 점수를 저장할 수 있습니다.
2. 인덱스는 0부터 시작합니다
배열에서 가장 중요한 개념은 인덱스입니다. 인덱스는 배열 안에서 값의 위치를 나타내는 번호입니다.
Java 배열의 인덱스는 1이 아니라 0부터 시작합니다.
| 인덱스 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 값 | 80 | 90 | 70 | 85 | 95 |
따라서 첫 번째 값은 scores[0], 두 번째 값은 scores[1]로 접근합니다.
int[] scores = {80, 90, 70, 85, 95};
System.out.println(scores[0]); // 80
System.out.println(scores[1]); // 90
System.out.println(scores[4]); // 95
배열의 마지막 인덱스는 배열 길이와 같지 않습니다. 배열 길이가 5라면 마지막 인덱스는 4입니다.
배열의 마지막 인덱스는 항상 배열 길이 - 1입니다.
3. 배열 선언과 초기화
Java에서 배열을 만드는 방법은 크게 두 가지가 있습니다.
첫 번째는 값을 바로 넣어서 만드는 방법입니다.
int[] numbers = {1, 2, 3, 4, 5};
두 번째는 크기를 먼저 정해두고 나중에 값을 넣는 방법입니다.
int[] numbers = new int[5];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;
알고리즘 문제에서는 입력값의 개수 N이 주어지고, 그 크기만큼 배열을 만드는 경우가 많습니다.
int n = 5;
int[] numbers = new int[n];
이렇게 만들면 n개의 값을 저장할 수 있는 배열이 생성됩니다.
4. 배열 전체 순회하기
배열 문제에서 가장 기본이 되는 작업은 배열을 처음부터 끝까지 확인하는 것입니다. 이것을 배열 순회라고 합니다.
int[] numbers = {10, 20, 30, 40, 50};
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
여기서 중요한 부분은 반복문의 조건입니다.
i < numbers.length
배열의 인덱스는 0부터 시작하기 때문에, i는 배열 길이보다 작을 때까지만 증가해야 합니다. 배열 길이가 5라면 i는 0, 1, 2, 3, 4까지만 사용해야 합니다.
| i 값 | 접근 위치 | 결과 |
|---|---|---|
| 0 | numbers[0] | 10 |
| 1 | numbers[1] | 20 |
| 2 | numbers[2] | 30 |
| 3 | numbers[3] | 40 |
| 4 | numbers[4] | 50 |
5. 인덱스 범위 초과 오류
배열을 사용할 때 가장 많이 만나는 오류 중 하나가 인덱스 범위 초과입니다. Java에서는 배열 범위를 벗어난 인덱스에 접근하면 오류가 발생합니다.
int[] numbers = {10, 20, 30, 40, 50};
System.out.println(numbers[5]);
위 코드는 오류가 발생합니다. 배열의 길이는 5이지만, 사용할 수 있는 인덱스는 0부터 4까지이기 때문입니다.
사용 가능한 인덱스: 0, 1, 2, 3, 4
잘못된 인덱스: 5
이런 오류를 피하려면 반복문의 범위를 정확히 작성해야 합니다.
// 올바른 방식
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
// 잘못된 방식
for (int i = 0; i <= numbers.length; i++) {
System.out.println(numbers[i]);
}
두 번째 코드에서 i가 numbers.length와 같아지는 순간 배열 범위를 벗어나게 됩니다.
배열 반복문에서는 대부분 i < 배열.length 조건을 사용합니다.
6. 배열에서 최댓값 찾기
배열 문제에서 자주 나오는 유형 중 하나는 최댓값 찾기입니다. 배열을 처음부터 끝까지 확인하면서 현재까지 가장 큰 값을 저장하면 됩니다.
int[] numbers = {3, 7, 2, 9, 4};
int max = numbers[0];
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] > max) {
max = numbers[i];
}
}
System.out.println(max);
여기서 max를 0으로 시작하지 않고 numbers[0]으로 시작한 이유가 중요합니다. 배열 안에 음수가 들어올 수도 있기 때문입니다.
int[] numbers = {-5, -2, -9, -1};
int max = numbers[0];
이렇게 배열의 첫 번째 값을 기준으로 잡으면 음수 배열에서도 안전하게 최댓값을 찾을 수 있습니다.
7. 배열에서 최솟값 찾기
최솟값도 최댓값과 비슷한 방식으로 구할 수 있습니다. 이번에는 현재 값이 min보다 작으면 min을 갱신합니다.
int[] numbers = {3, 7, 2, 9, 4};
int min = numbers[0];
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] < min) {
min = numbers[i];
}
}
System.out.println(min);
최댓값과 최솟값 문제는 배열을 한 번만 순회하면 되므로 시간복잡도는 O(N)입니다.
8. 배열의 합계 구하기
배열 안에 있는 모든 값을 더하는 문제도 자주 등장합니다. 합계를 저장할 변수 sum을 만들고, 배열을 순회하면서 값을 누적하면 됩니다.
int[] numbers = {10, 20, 30, 40, 50};
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
System.out.println(sum);
위 코드의 흐름은 다음과 같습니다.
- sum을 0으로 시작한다.
- 배열의 첫 번째 값부터 마지막 값까지 확인한다.
- 각 값을 sum에 더한다.
- 반복이 끝나면 sum을 출력한다.
이 역시 배열을 한 번만 순회하므로 시간복잡도는 O(N)입니다.
9. 조건에 맞는 값 세기
배열에서 특정 조건을 만족하는 값의 개수를 세는 문제도 많이 나옵니다. 예를 들어 배열에서 짝수의 개수를 세어보겠습니다.
int[] numbers = {1, 2, 3, 4, 5, 6};
int count = 0;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 == 0) {
count++;
}
}
System.out.println(count);
조건에 맞는 값을 찾을 때는 보통 if문과 count 변수를 함께 사용합니다.
| 상황 | 조건 예시 |
|---|---|
| 짝수 찾기 | numbers[i] % 2 == 0 |
| 홀수 찾기 | numbers[i] % 2 != 0 |
| 양수 찾기 | numbers[i] > 0 |
| 특정 값 이상 찾기 | numbers[i] >= target |
배열을 순회하면서 조건을 확인하는 방식은 알고리즘 기초 구현 문제에서 매우 자주 사용됩니다.
10. 배열 문제에서 자주 쓰는 패턴
배열 문제는 형태가 다양해 보여도 기본 패턴은 비슷합니다. 처음에는 아래 패턴에 익숙해지는 것이 좋습니다.
| 유형 | 필요한 변수 | 핵심 흐름 |
|---|---|---|
| 합계 구하기 | sum | 값을 하나씩 더한다 |
| 개수 세기 | count | 조건을 만족하면 1 증가 |
| 최댓값 찾기 | max | 더 큰 값이 나오면 갱신 |
| 최솟값 찾기 | min | 더 작은 값이 나오면 갱신 |
| 특정 값 찾기 | found | 조건을 만족하면 true |
처음부터 어려운 알고리즘을 외우기보다, 이런 기본 패턴을 정확히 익히는 것이 중요합니다.
배열 문제의 핵심은 인덱스 범위를 안전하게 다루고, 필요한 값을 정확히 갱신하는 것입니다.
11. 정리
이번 글에서는 배열과 인덱스 처리에 대해 정리했습니다.
- 배열은 여러 값을 순서대로 저장하는 자료구조이다.
- Java 배열의 인덱스는 0부터 시작한다.
- 배열의 마지막 인덱스는 배열 길이 - 1이다.
- 배열을 순회할 때는 보통 i < 배열.length 조건을 사용한다.
- 최댓값과 최솟값은 배열의 첫 번째 값을 기준으로 잡는 것이 안전하다.
- 합계, 개수 세기, 조건 검사 문제는 배열 기초 구현에서 자주 등장한다.
배열은 알고리즘 문제의 시작점입니다. 인덱스와 반복문이 익숙해지면 이후 문자열, 정렬, 탐색 문제도 훨씬 수월하게 이해할 수 있습니다.
배열을 잘 다룬다는 것은 값을 저장하고, 순회하고, 조건에 맞게 갱신하는 흐름을 정확히 이해한다는 뜻입니다.
다음 글 예고
다음 글에서는 문자열 처리 기초에 대해 알아보겠습니다.
문자열 길이 확인, 문자 접근, 문자열 비교, 반복문을 이용한 문자 처리까지 차근차근 정리해보겠습니다.

'Problem Solving > Algorithm' 카테고리의 다른 글
| [알고리즘] 09. 문자열 자르기와 비교 (0) | 2026.06.24 |
|---|---|
| [알고리즘] 08. 문자열 처리 기초 (0) | 2026.06.24 |
| [알고리즘] 06. 알고리즘 문제 풀이 순서 (0) | 2026.06.23 |
| [알고리즘] 05. 완전탐색이 필요한 상황 (0) | 2026.06.23 |
| [알고리즘] 04. 입력 크기별 알고리즘 선택법 (0) | 2026.06.23 |