https://www.acmicpc.net/problem/3048
풀이법
1) 구현(시뮬레이션)을 활용하여 풀 수 있는 문제였다.
2) 첫번째 개미 그룹은 역순으로, 두번째 개미 그룹은 순방향으로 최종 배열 vec에 넣어주었고, 입력받은 time(몇 초 후)를 통해 while 반복을 돌려 주었다.
3) for문을 돌림에 있어 항상 첫번째 인자 부터 돌렸기에 pair<char,int>를 두어서 두번쨰 인자가 1인 경우 우측으로 이동, 2인 경우 좌측으로 이동하는 것으로 코딩을 진행하였다.
4) 현재 값의 방향과 다음 index의 방향이 같은 경우, continue 시켜서 다음 인자를 탐색하였다. index의 방향이 우측으로 이동할 때만 swap을 간단하게 구현하여 방향을 바꾸어주어 문제를 해결하였다. (이후 for문의 index인 i를 증가 시켜서 비교 하고 있던 i와 i+1에서 바로 i+2로 넘어갈 수 있도록 구현하였다)
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <cstring>
#define INF 987654321
using namespace std;
int n, m,time;
string a, b;
string newA;
vector<pair<char, int>> vec;
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
cin >> n >> m;
cin >> a >> b;
for (int i = a.size()-1; i >= 0; i--)
{
newA += a[i]; //뒤집어 주기
}
cin >> time;
for (int i = 0; i < newA.size(); i++)
{
vec.push_back({ newA[i],1 });
}
for (int i = 0; i < b.size(); i++)
{
vec.push_back({ b[i],2 });
}
while (time > 0)
{
for (int i = 0; i < vec.size() - 1; i++)
{
if (vec[i].second == vec[i + 1].second)
{
continue;
}
else
{
if (vec[i].second == 1)
{
char tmpC = vec[i].first;
int tmpD = vec[i].second;
vec[i].first = vec[i + 1].first;
vec[i].second = vec[i + 1].second;
vec[i + 1] = { tmpC,tmpD };
i++;
}
}
}
time--;
}
for (int i = 0; i < vec.size(); i++)
{
cout << vec[i].first;
}
}
'Coding_Test_C++' 카테고리의 다른 글
BaekJoon 4963번: 섬의 개수(C++) (0) | 2021.07.28 |
---|---|
BaekJoon 3085번: 사탕 게임(C++) (0) | 2021.07.27 |
BaekJoon 2784번: 가로 세로 퍼즐(C++) (0) | 2021.07.27 |
BaekJoon 1986번: 체스(C++) (0) | 2021.07.26 |
BaekJoon 1347번: 미로 만들기(C++) (0) | 2021.07.25 |