728x90
https://www.acmicpc.net/problem/3048
3048번: 개미
T초가 지난 후에 개미의 순서를 출력한다. 첫 번째 개미 그룹은 왼쪽에서 오른쪽으로 움직이고, 두 번째 그룹은 반대 방향으로 움직인다.
www.acmicpc.net
문자열에 대해서 잘 안다면 빠르게 풀 수 있는 문제.
s1 문자열을 거꾸로 뒤집기 위해서 reverse()를 사용했고, s1와 s2를 합쳐서 ans에 넣었다.
그 후, ans 문자열 전체를 반복문으로 돌면서 개미 두 마리를 검사했다. (s1에 있는 개미인지, s2에 있는 개미인지)
문자열도 벡터처럼 find 함수를 사용해서 확인하고 싶은 원소가 해당 문자열에 있는지 확인할 수 있는데, 이때 string::npos를 사용했다.
찾는 문자열이 없는 경우, npos를 반환한다. 그러므로 find가 뱉어내는 반환자가 npos라면 확인하고 싶은 원소가 문자열에 없다는 뜻이다.
이 문제에서는
- ans[i]가 s1에 있고, ans[i+1]가 s2에 있는 경우
- ans[i]가 s1에 없고, ans[i+1]가 s2에 없는 경우 → 각각 s2, s1에 있는 경우
즉, ans[i]와 ans[i+1]가 같은 문자열에 없는 경우 반대 방향의 개미가 서로 바라보고 있는 것이므로 swap()로 뒤집어 준다.
그리고 꼭 반복문의 인덱스를 증가해줘야한다. 아니면 했던 애를 또 하게 되니까,,
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n1, n2, t;
string s1, s2, ans;
cin >> n1 >> n2 >> s1 >> s2 >> t;
reverse(s1.begin(), s1.end());
ans = s1 + s2;
while(t--){
for(int i=0; i<ans.length()-1; i++){
if(s1.find(ans[i]) != string::npos && s2.find(ans[i+1]) != string::npos){ //s1에 없다면 -> npos
swap(ans[i], ans[i+1]);
i++;
}
}
}
cout << ans << '\n';
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 9205번: 맥주 마시면서 걸어가기 (0) | 2022.04.28 |
---|---|
[백준/c++] 5014번: 스타트링크 (0) | 2022.04.27 |
[백준/c++] 1417번: 국회의원 선거 (0) | 2022.04.26 |
[백준/c++] 10709번: 기상캐스터 (0) | 2022.04.22 |
[백준/c++] 9517번: 아이 러브 크로아티아 (0) | 2022.04.22 |