BOJ/투포인터
[C/C++] 백준 - 11728번 : 배열 합치기
JWonK
2021. 9. 6. 00:41
728x90
반응형
https://www.acmicpc.net/problem/11728
11728번: 배열 합치기
첫째 줄에 배열 A의 크기 N, 배열 B의 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000,000) 둘째 줄에는 배열 A의 내용이, 셋째 줄에는 배열 B의 내용이 주어진다. 배열에 들어있는 수는 절댓값이 109보다 작거
www.acmicpc.net
문제
정렬되어있는 두 배열 A와 B가 주어진다. 두 배열을 합친 다음 정렬해서 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 배열 A의 크기 N, 배열 B의 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000,000)
둘째 줄에는 배열 A의 내용이, 셋째 줄에는 배열 B의 내용이 주어진다. 배열에 들어있는 수는 절댓값이 109보다 작거나 같은 정수이다.
출력
첫째 줄에 두 배열을 합친 후 정렬한 결과를 출력한다.
이 문제에 대한 풀이는 2개가 존재하는 것 같다.
분할 정복과 투 포인터. 일단 나는 투포인터로 문제를 해결했다.
투포인터로
하나의 포인터는 A의 시작점
또 다른 포인터는 B의 시작점에 둔다.
그리고 두 개를 비교하면서 더 작은 것이 존재한다면 그것을 넣고 다음 인덱스로 포인터를 옮겨준다.
만약 두 개의 포인터가 가리키는 값이 같다면 2개 모두 값을 넣어주고 포인터를 하나 옆으로 옮겨준다.
근데 주의해야할점이 무작정 포인터만 옮기면, 배열의 크기보다 큰 인덱스에 포인터가 참조할 수도 있다.
이 부분만 주의해서 코드를 작성하면 된다.
#include <iostream>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
#define ll long long
#define INF 987654321
#define CUNLINK ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define MAX 100000 + 1
using namespace std;
int N, M;
int main() {
CUNLINK;
cin >> N >> M;
vector<int> A(N, 0), B(M, 0);
for (int i = 0; i < N; i++) cin >> A[i];
for (int i = 0; i < M; i++) cin >> B[i];
int st = 0, en = 0;
vector<int> answer;
while (answer.size() != (N + M)) {
if (A[st] < B[en]) {
answer.push_back(A[st++]);
if (st == N) {
while (en != M) answer.push_back(B[en++]);
}
}
else if (A[st] > B[en]) {
answer.push_back(B[en++]);
if (en == M) {
while (st != N) answer.push_back(A[st++]);
}
}
else if (A[st] == B[en]) {
answer.push_back(A[st++]);
if (st == N) {
while (en != M) answer.push_back(B[en++]);
}
if (en < M) {
answer.push_back(B[en++]);
if (en == M) {
while (st != N) answer.push_back(A[st++]);
}
}
}
}
for (auto a : answer) cout << a << " ";
return 0;
}
728x90
반응형