개요
보통 배열은 데이터를 쌓아두는 용도로 사용한다.
배열을 다음과 같은 접근으로 생각하면 문제를 효율적으로 풀 수 있는 경우가 많다!
배열을 인덱스에 해당하는 원소를 빠르게 접근하는 목적으로 사용한다.
문장만 봐서는 뜻이 아리까리 하다.
예시 문제로 이해해보자.
두 원소의 합이 100
주어진 길이 N의 int 배열 arr에서 합이 100인 서로 다른 위치의 두 원소가 존재하면 1을, 존재하지 않으면 0을 반환하는 함수 func2(int arr[], int N)을 작성하라. arr의 각 수는 0 이상 100 이하이고 N은 1000 이하이다.
예시
func2({1, 52, 48}, 3) = 1,
func2({50, 42}, 2) = 0
문제를 봤을 때 O(N^2)의 시간복잡도를 가지는 풀이가 생각날 것이다.
배열을 순차적으로 순회하며 다른 모든 원소와 합이 100이 되는지 판별하면 된다.
하지만 위의 배열의 접근법을 활용하면 O(N)의 풀이를 할 수 있다.
#include<bits/stdc++.h>
using namespace std;
int func2(int arr[], int N) {
int answer[101] = {};
for (int i = 0; i < N; i++) {
if (answer[100 - arr[i]] != 0)
return 1;
answer[arr[i]]++;
}
return 0;
}
코드를 보면 각 index에 해당하는 숫자가 배열에 등장했는지 빈도 수를 저장하고 현재 원소와 더하면 100이 되는 원소가 등장했었는지 확인하며 문제를 해결했다. 위의 경우 배열을 한번만 순회하면 되기 때문에 O(N)의 시간 복잡도를 가진다.
키 포인트
- 문제를 앞에 등장한 원소 중 더해서 100이 되는지 확인하는 문제로 재해석
- 등장여부를 배열에 저장하여 확인
'Algorithm' 카테고리의 다른 글
[Algorithm] 옥상 정원 꾸미기 (백준 6198) (1) | 2024.12.29 |
---|---|
[Algorithm] 에디터 문제 풀이 (1) | 2024.12.22 |
[Algorithm]C++ 배열 (0) | 2024.12.19 |
[TIL]기초 코드 작성 요령 1 (3) | 2024.12.18 |
[TIL] visual studio 2022에서 <bits/stdc++.h> (0) | 2024.12.17 |