📌 [알고리즘 정복] 1차원 배열: 데이터의 기본이자 전부
배열은 프로그래밍에서 데이터를 담는 가장 기본적인 도구입니다. 단순히 값을 저장하는 것을 넘어, 메모리 효율과 언어별 특성을 이해하는 것이 실력의 차이를 만듭니다. 백준 1단계부터 평균 계산(1546번)까지 달려오며 배운 핵심을 요약합니다.
1. 배열의 선언과 확장: 미리 방을 만들 것인가?
데이터를 담는 '바구니'를 만들 때, 메모리를 다루는 방식에 따라 성능이 달라집니다.
| 특징 | Python (list) | C++ (std::vector) |
| 선언 | v = [] | vector<int> v; |
| 미리 할당 | [0] * n | v.reserve(n) 또는 v(n) |
| 추가 | append() | push_back() |
💡 실무 Insight: 데이터 개수를 미리 안다면 **reserve()**를 쓰거나 크기를 지정(v(n))하세요. 공간을 미리 확보하면 메모리 재할당(Reallocation)으로 인한 "이사 비용"을 줄여 성능을 비약적으로 높일 수 있습니다.
2. 값의 교환과 뒤집기 (Swap & Reverse)
데이터의 순서를 바꾸는 로직은 모든 정렬 알고리즘의 기초입니다.
- Python: a, b = b, a (튜플 언패킹을 이용한 직관적인 교환)
- C++: std::swap(a, b) 또는 std::reverse(begin, end) (표준 라이브러리 활용)
특히 **10811번(바구니 뒤집기)**에서 사용한 파이썬의 슬라이싱 [::-1]과 C++의 std::reverse는 실무에서도 문자열이나 리스트를 뒤집을 때 가장 많이 쓰이는 방식입니다.
3. 존재 여부 확인: 체크 배열 vs find 함수
"과제 안 내신 분(5597번)" 문제에서 배운 핵심 전략입니다.
- 체크 배열 (Marking): 인덱스 자체를 '번호'로 사용합니다 (예: check[30]). 조회 속도가 O(1)로 압도적으로 빠릅니다.
- std::find (Search): 명시적으로 값을 검색합니다. 가독성이 좋아 실무에서 선호되지만, 처음부터 끝까지 뒤지므로 O(N)의 시간이 걸립니다.
💡 요약: 데이터 범위가 정해져 있고 성능이 중요하다면 체크 배열, 가독성과 편의성이 중요하다면 **find**를 선택하는 것이 좋습니다.
4. 실무형 표준 함수 활용법 (C++ STL)
고급 개발자로 가는 길은 "이미 잘 만들어진 함수"를 정확히 쓰는 것에서 시작합니다.
- std::iota: 배열을 1, 2, 3... 순서대로 채울 때 사용합니다. Python의 range와 유사한 역할을 합니다.
- std::max_element: 루프를 돌리지 않고도 배열 내 최댓값의 위치(반복자)를 찾아냅니다.
- std::vector::reserve: 불필요한 메모리 복사를 방지하는 성능 최적화의 필수 요소입니다.
5. 인덱스 전략: N vs N+1
배열 공부의 80%는 인덱스 범위를 어떻게 잡느냐에 달려 있습니다.
- N 전략 (0-based): 표준적인 방식이지만, 문제의 번호(1번부터 시작)를 쓸 때마다 -1 보정이 필요합니다.
- N+1 전략 (1-based): 0번 방을 비워두고 1번부터 사용합니다. 문제의 직관을 코드에 그대로 옮길 수 있어 실수를 줄여줍니다.
🚀 마치며
1차원 배열은 단순해 보이지만, 메모리 할당의 원리와 표준 함수의 적절한 활용에 따라 코드의 질이 달라집니다. 이제 배열을 마스터했으니, 다음 단계인 문자열(String) 파트에서 데이터를 텍스트 단위로 요리하는 법을 배워보겠습니다!
'코딩테스트 > 백준' 카테고리의 다른 글
| [C/Python] 2차원 배열 (0) | 2026.03.04 |
|---|---|
| [C/Python] 심화1 (0) | 2026.03.04 |
| [C/Python] 문자열 (0) | 2026.03.02 |
| [C/Python]반복문 (0) | 2026.02.26 |
| [C/Python] 조건문 (0) | 2026.02.25 |