Problem Solving/백준

[백준/c++] 11728 - 배열 합치기

세고래 2021. 4. 24. 02:52

https://www.acmicpc.net/problem/11728

 

11728번: 배열 합치기

첫째 줄에 배열 A의 크기 N, 배열 B의 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000,000) 둘째 줄에는 배열 A의 내용이, 셋째 줄에는 배열 B의 내용이 주어진다. 배열에 들어있는 수는 절댓값이 109보다 작거

www.acmicpc.net


1) 풀이

두개의 배열에 주어지는 각각의 숫자를 저장한 뒤, 두 배열의 맨 앞 숫자들을 비교하여 더 작은 숫자를 출력해주고 출력해준 숫자는 배열에서 뺀 뒤 다시 비교를 반복하면 되는 문제이다.

배열의 맨앞을 pop 해줘야 하므로, 자료구조 중 deque을 이용하기로 했다!

deque에 대한 자세한 설명은 3) 참고자료 블로그링크를 확인하길 바람

 

굉장히 간단한 원리의 문제라서 더이상 설명할 게 없다!

두 deque의 숫자를 맨앞부터 비교해서 오름차순인 배열을 만들기 위해서는

원래 sort함수를 이용하여 정렬해주어야 하지만 문제에서 input이 오름차순으로 주어지기 때문에 맨앞의 숫자들만 비교해서 숫자가 더 작은 순으로 출력해주면 자동적으로 정렬된 하나의 배열이 출력된다😁

 

그래두... 모... 굳이 유의할 점을 적어보자면!

중간에 어느 한 배열이 비는 경우도 있을 수 있으므로 그 경우도 코드로 처리해주어야 한다는 것!

 

2) 최종 소스코드
#include <bits/stdc++.h>
using namespace std;
deque<int>a; //배열 a
deque<int>b; //배열 b
int n, m;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> m;
	while (n--) { //배열 a에 숫자들 저장
		int t;
		cin >> t;
		a.push_back(t);
	}
	while (m--) { //배열 b에 숫자들 저장
		int t;
		cin >> t;
		b.push_back(t);
	}

	while (!a.empty() || !b.empty()) { //or이기 때문에 어느 하나가 비어도 끝나지 않고 둘다 비어야 끝남
		if (a.empty() && !b.empty()) { //a가 다 비었지만 b가 비지 않은 경우
			while (!b.empty()) {
				cout << b.front() << ' ';
				b.pop_front();
			}
			break;
		}
		else if (!a.empty() && b.empty()) {//b가 다 비었지만 a가 비지 않은 경우
			while (!a.empty()) {
				cout << a.front() << ' ';
				a.pop_front();
			}
			break;
		}
		if (a.front() <= b.front()) { //비교함수. 더 작은 수를 출력, pop
			cout << a.front() << ' ';
			a.pop_front();
		}
		else if (a.front() > b.front()) {
			cout << b.front() << ' ';
			b.pop_front();
		}

	}
}
3) 참고 자료

blockdmask.tistory.com/73

728x90