배열 합치기 (boj.kr/11728)
풀이코드 (시간 초과)
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
#include <cmath>
#include <string>
using namespace std;
// 11728 배열 합치기
int main(){
int n, m;
cin >> n >> m;
vector<int> a(n + 1);
vector<int> b(m + 1);
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= m; i++) cin >> b[i];
vector<int> ans;
int idxA = 1 , idxB = 1;
bool flagA = false, flagB = false;
while(true){
if(idxA > n){
flagA = true;
break;
}
else if(idxB > m){
flagB = true;
break;
}
if(a[idxA] > b[idxB]){
ans.push_back(b[idxB]);
idxB++;
}
else{
ans.push_back(a[idxA]);
idxA++;
}
}
if(flagA){
for(int i = idxB; i <= m; i++){
ans.push_back(b[i]);
}
}
else if(flagB){
for(int i = idxA; i <= n; i++){
ans.push_back(a[i]);
}
}
for(int a : ans){
printf("%d ", a);
}
}
풀이코드 (시간 초과는 아니지만 매우 느림)
cin 을 scanf 로 바꾸었더니 시간 초과는 면함. 입출력 신경써야 한다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
#include <cmath>
#include <string>
using namespace std;
// 11728 배열 합치기
int main(){
int n, m;
cin >> n >> m;
vector<int> a(n + 1);
vector<int> b(m + 1);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= m; i++) scanf("%d", &b[i]);
vector<int> ans;
int idxA = 1 , idxB = 1;
bool flagA = false, flagB = false;
while(true){
if(idxA > n){
flagA = true;
break;
}
else if(idxB > m){
flagB = true;
break;
}
if(a[idxA] > b[idxB]){
ans.push_back(b[idxB]);
idxB++;
}
else{
ans.push_back(a[idxA]);
idxA++;
}
}
if(flagA){
for(int i = idxB; i <= m; i++){
ans.push_back(b[i]);
}
}
else if(flagB){
for(int i = idxA; i <= n; i++){
ans.push_back(a[i]);
}
}
for(int a : ans){
printf("%d ", a);
}
}
풀이코드 (vector 에 넣지 않고, 바로 출력하는 방식)
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
#include <cmath>
#include <string>
using namespace std;
// 11728 배열 합치기
int main(){
int n, m;
cin >> n >> m;
vector<int> a(n + 1);
vector<int> b(m + 1);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= m; i++) scanf("%d", &b[i]);
vector<int> ans;
int idxA = 1 , idxB = 1;
bool flagA = false, flagB = false;
while(true){
if(idxA > n){
flagA = true;
break;
}
else if(idxB > m){
flagB = true;
break;
}
if(a[idxA] > b[idxB]){
printf("%d ", (b[idxB]));
idxB++;
}
else{
printf("%d ", (a[idxA]));
idxA++;
}
}
if(flagA){
for(int i = idxB; i <= m; i++){
printf("%d ", (b[i]));
}
}
else if(flagB){
for(int i = idxA; i <= n; i++){
printf("%d ", (a[i]));
}
}
}
해설
적용한 레시피 / 방법론 + 접근법
풀이
1. merge sort 의 기본이 되는 문제이다.
아쉬웠던 부분 / 오답 원인 / 개선해야 할 점
1. 입력 받는 값들이 최대 1,000,000 개이다. 이런 문제에서는 무조건 입출력 방식을 신경써야 한다. 저수준 입출력 방식인 scanf pritnf 를 되도록이면, 사용하자.
반응형
'ps > 정렬' 카테고리의 다른 글
[상한과 하한] 숫자카드 2(boj.kr/10816) (0) | 2021.10.09 |
---|