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) 참고 자료
728x90
'Problem Solving > 백준' 카테고리의 다른 글
[백준/c++] 20551 - Sort 마스터 배지훈의 후계자 (0) | 2021.04.24 |
---|---|
[백준/c++] 20044 - Project Teams (0) | 2021.04.24 |
[백준/c++] 19637 - IF문 좀 대신 써줘 (0) | 2021.04.23 |
[백준/c++] 21313 - 문어 (2) | 2021.04.18 |
[백준/c++] 15927 - 회문은 회문아니야!! (0) | 2021.03.27 |