RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
← 브론즈 III

배열

같은 자료형 여러 개를 줄지어 담는 그릇 — 인덱스 순회.

기초 & 구현 Bronze III 브론즈 III
선수 지식: 반복문
1강 1차원 배열: 값을 일렬로 담기 공식

배열이란?

배열(array) 은 같은 자료형의 값을 일렬로 늘어놓고, 번호(인덱스)로
하나씩 꺼내 쓰는 자료구조입니다. 변수 100개를 따로 만드는 대신 배열 하나로
관리할 수 있습니다.

인덱스는 0부터 시작합니다. 크기 n인 배열의 칸은 0, 1, ..., n-1입니다.


1. 선언과 입력

C++

#include <bits/stdc++.h>
using namespace std;
int a[100000]; // 충분히 크게 잡는다(전역이면 0으로 초기화됨)
int main() {
    int n; cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
}

Python

n = int(input())
a = list(map(int, input().split())) # 한 줄에 n개의 수

팁(C++): 큰 배열은 main 밖(전역)에 선언하면 자동으로 0으로 초기화되고
스택 오버플로도 피할 수 있습니다.


2. 순회하기

for (int i = 0; i < n; i++)
    cout << a[i] << ' ';
for x in a:
    print(x, end=' ')

파이썬은 값을 직접 꺼내는 for x in a가 깔끔하지만, 인덱스가 필요하면
for i in range(n): a[i] 또는 enumerate(a)를 씁니다.


3. 자주 쓰는 패턴

합 / 최댓값 / 최솟값

long long sum = 0;
int mx = a[0], mn = a[0];
for (int i = 0; i < n; i++) {
    sum += a[i];
    mx = max(mx, a[i]);
    mn = min(mn, a[i]);
}
print(sum(a), max(a), min(a))

특정 값 세기 / 찾기 — 값의 범위가 작을 땐 "개수 세기 배열"이 강력합니다.

int cnt[10001] = {0}; // 값이 0~10000일 때
for (int i = 0; i < n; i++) cnt[a[i]]++;

4. 인덱스 범위를 벗어나면? (가장 중요)

int a[5];
a[5] = 1; // 잘못! 유효한 인덱스는 0~4

배열 범위를 벗어난 접근은 C++에서 런타임 에러나 엉뚱한 값으로 이어지고,
파이썬에서는 IndexError가 납니다. n개짜리 배열의 마지막 칸은 a[n-1]임을
항상 기억하세요.


5. 자주 하는 실수

  • off-by-onei <= n으로 도는 바람에 a[n]을 건드리는 경우. 보통 i < n이 맞습니다.
  • 배열 크기 부족 — 입력 최대 개수보다 작게 잡아 넘침. 문제의 최댓값보다 넉넉히 잡으세요.
  • 초기화 안 함(C++ 지역 배열) — 합/카운트 배열은 0으로 시작해야 합니다.

연습 팁

배열 문제를 풀 땐 인덱스가 0부터인지 1부터인지 먼저 정하고 끝까지
일관되게 쓰세요. 1번 사람을 a[1]에 넣기로 했으면 배열을 한 칸 크게 잡으면
됩니다. 섞어 쓰면 off-by-one 버그의 온상이 됩니다.

2강 배열을 한 단계 깊게: 순회와 집계 공식

배열 활용을 한 단계 끌어올리기

배열 선언과 인덱싱은 익혔다고 보고, 여기서는 배열을 굴려 정보를 뽑아내는 실전
기법을 다룹니다. 대부분의 Bronze 배열 문제는 이 패턴의 조합입니다.


1. 최댓값·최솟값과 그 위치

값만이 아니라 몇 번째인지도 자주 묻습니다.

int n; cin >> n;
int a[1000];
for (int i = 0; i < n; i++) cin >> a[i];

int best = a[0], idx = 0;
for (int i = 1; i < n; i++) {
    if (a[i] > best) { best = a[i]; idx = i; }
}
cout << best << ' ' << idx + 1 << '\n';   // 값과 1-based 위치
a = list(map(int, input().split()))
best = max(a)
idx = a.index(best)
print(best, idx + 1)

2. 빈도 세기 (counting)

"각 값이 몇 번 나왔는가?"는 값을 인덱스로 쓰는 배열로 셉니다.

int cnt[101] = {0};         // 값 범위가 0~100일 때
for (int i = 0; i < n; i++) {
    int x; cin >> x;
    cnt[x]++;               // 값 x가 한 번 더 나왔다
}
cnt = [0] * 101
for x in map(int, input().split()):
    cnt[x] += 1

이 "값을 인덱스로" 기법은 정렬 없이 빈도·등장 여부를 \(O(N)\)에 파악하는 강력한
도구입니다. 단, 값의 범위만큼 배열을 잡을 수 있을 때만 가능합니다.


3. 거꾸로·건너뛰며 순회

for (int i = n - 1; i >= 0; i--) cout << a[i] << ' ';  // 역순
for (int i = 0; i < n; i += 2)   cout << a[i] << ' ';  // 짝수 인덱스만

순회 방향과 간격을 바꾸면 다양한 요구를 처리할 수 있습니다.


4. 자주 하는 실수

  • 범위 초과 — 크기 N 배열의 유효 인덱스는 0 ~ N-1. a[N]은 금지.
  • 빈도 배열 크기 부족 — 값의 최댓값 + 1만큼 잡아야 함.
  • 초기화 누락 — C++ 전역 배열은 0이지만, 지역 배열은 쓰레기 값.

정리

배열에서 정보를 뽑는 핵심 도구는 (1) 최대/최소와 위치, (2) 값을 인덱스로 쓰는
빈도 세기
, (3) 방향·간격을 바꾼 순회입니다. 특히 빈도 세기는 Bronze~Silver에서
끝없이 쓰이니 꼭 손에 익히세요.

3강 배열로 푸는 실전 문제 공식

배열 응용 문제 풀이

배열을 이용한 대표 문제 유형을 코드로 정리합니다. 입력을 배열에 담아 두고 두 번
이상 훑는 것이 공통 패턴입니다.


1. 평균보다 큰 값 세기 (두 번 순회)

한 번 훑어 평균을 구하고, 다시 훑으며 비교합니다.

int n; cin >> n;
int a[1000];
long long sum = 0;
for (int i = 0; i < n; i++) { cin >> a[i]; sum += a[i]; }
double avg = (double)sum / n;
int cnt = 0;
for (int i = 0; i < n; i++) if (a[i] > avg) cnt++;
cout << cnt << '\n';
a = list(map(int, input().split()))
avg = sum(a) / len(a)
print(sum(1 for x in a if x > avg))

"전체 정보가 필요한 계산(평균 등)"은 다 모은 뒤에야 가능하므로 두 번 순회
자연스럽습니다.


2. 점수 재계산 (배열 갱신)

int maxv = 0;
for (int i = 0; i < n; i++) maxv = max(maxv, a[i]);
double total = 0;
for (int i = 0; i < n; i++) total += a[i] * 100.0 / maxv;  // 최고점 기준 환산
cout << total / n << '\n';

3. 등장 여부 표 (값을 인덱스로)

"이 수가 나왔는가?"를 빠르게 확인:

bool seen[1000001] = {false};
for (int i = 0; i < n; i++) {
    int x; cin >> x;
    seen[x] = true;          // x가 등장했음을 표시
}
int q; cin >> q;             // 질의
cout << (seen[q] ? 1 : 0) << '\n';
seen = set()
for x in map(int, input().split()):
    seen.add(x)
q = int(input())
print(1 if q in seen else 0)

값 범위가 너무 크면 C++ 배열 대신 파이썬 set/C++ set을 쓰는 게 좋습니다.


4. 함정과 패턴 인식

  • 평균 정수 나눗셈sum / n을 int로 하면 소수가 잘림. double 형변환.
  • 합 오버플로sumlong long.
  • 배열 크기 — 문제의 N 최댓값보다 넉넉히 잡기.

문제에 "N개의 수가 주어진다", "평균/최댓값/순위", "몇 번째", "나온 적 있는가"
같은 말이 보이면 배열에 담아 처리하는 문제입니다.


정리

배열 문제는 (1) 일단 배열에 다 담고, (2) 필요한 만큼 여러 번 훑으며, (3) 값을
인덱스로 쓰는 기법을 곁들이면 대부분 풀립니다. 합은 long long, 평균은 double을
잊지 마세요.