-
[백준] 3048번 개미문제 풀이 2020. 4. 6. 23:40
3048 개미
문제
개미가 일렬로 이동할 때, 가장 앞의 개미를 제외한 나머지 개미는 모두 앞에 개미가 한 마리씩 있다.
서로 반대 방향으로 이동하던 두 개미 그룹이 좁은 길에서 만났을 때, 개미는 어떻게 지나갈까?
최근 연구에 의하면 위와 같은 상황이 벌어지면 개미는 서로를 점프해서 넘어간다고 한다.
즉, 두 그룹이 만났을 때, 1초에 한번씩 개미는 서로를 뛰어 넘는다. (한 개미가 다른 개미를 뛰어 넘고, 다른 개미는 그냥 전진한다고 생각해도 된다)
하지만 모든 개미가 점프를 하는 것은 아니다. 자신의 앞에 반대 방향으로 움직이던 개미가 있는 경우에만 점프를 하게 된다.
첫 번째 그룹이 ABC로 움직이고, 두 번째 그룹의 개미가 DEF순으로 움직인다고 하자. 그럼, 좁은 길에서 만났을 때, 개미의 순서는 CBADEF가 된다. 1초가 지났을 때는 자신의 앞에 반대방향으로 움직이는 개미가 있는 개미는 A와 D다. 따라서, 개미의 순서는 CBDAEF가 된다. 2초가 되었을 때, 자신의 앞에 반대 방향으로 움직이는 개미는 B,D,A,E가 있다. 따라서, 개미의 순서는 CDBEAF가 된다.
T초가 지난 후에 개미의 순서를 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 첫 번째 그룹의 개미의 수 N1과 두 번째 그룹의 개미의 수 N2가 주어진다.
다음 두 개 줄에는 첫 번째 그룹과 두 번째 그룹의 개미의 순서가 주어진다. 각 개미는 알파벳 대문자로 표현할 수 있으며, 두 그룹에서 중복되는 알파벳은 없다.
마지막 줄에는 T가 주어진다. (0 ≤ T ≤ 50)
출력
T초가 지난 후에 개미의 순서를 출력한다. 첫 번째 개미 그룹은 왼쪽에서 오른쪽으로 움직이고, 두 번째 그룹은 반대 방향으로 움직인다.
풀이)
한 개미가 다른 개미를 뛰어넘고, 다른 개미는 그냥 전진한다고 생각해도 된다 하였으니
A그룹이 전진하고, B그룹이 뛰어넘는 개미들이라고 생각하고 시뮬레이션 해봤다.
예시에서 A가 ABC, B그룹이 DEF라고 했을때
A그룹의 개미수 * 2 -1 + 2 * (B그룹의 개미 수 * 2 - 1) 크기를 가진 배열이 있다하자.
B그룹이 A그룹 개미들의 사이 사이를 점프하면 되는 것이니깐,
사이 사이에 배열의 공간을 두고 그 곳으로 이동한다고 생각했다.
아래 그림을 보면 좀 더 이해가 갈 것이다.
출력은 빈공간을 제외하고 알파벳 부분만 출력하면 된다.
그리고 위의 그림을 보면 알겠듯이,
A그룹 개미수와 B그룹 개미수의 합 - 1 만큼만 시간이 지나면 개미들이 서로 마주치지않으니깐
입력 T가 마주치지 않는 시간보다 크다면 그냥 바로 종료해주었다.
((설명을 하려니 어렵다. 코드와 위의 그림을 보고 이해하는 것이 빠를 듯 하다.))
코드)
123456789101112131415161718192021222324252627282930313233343536373839#include <stdio.h>#include <vector>using namespace std;int main() {int n1, n2;scanf("%d %d", &n1, &n2);getchar();int total = 2 * (2 * n2 - 1) + 2 * n1 - 1;vector <char> gemi(total,'.');for (int i = 2 * n2 + 2 * n1 - 3; i >= 2 * n2 - 1; i -= 2) {char ch;scanf("%c", &ch);gemi[i] = ch;}getchar();for (int i = 2 * n2 + 2 * n1 - 2; i < total; i += 2) {char ch;scanf("%c", &ch);gemi[i] = ch;}int time;scanf("%d", &time);int limit = n1 + n2, cnt = 1;while (time-- && cnt < limit){for (int i = 0; i < total-2; i += 2) {gemi[i] = gemi[i + 2];gemi[i + 2] = '.';}cnt++;}for (int i = 0; i < total; i++) {if (gemi[i] == '.')continue;printf("%c", gemi[i]);}return 0;}cs 결과)
'문제 풀이' 카테고리의 다른 글
[백준] 1654번 랜선 자르기 (0) 2020.04.08 [백준] 17836번 공주님을 구해라 (0) 2020.04.07 [백준] 3109번 빵집 (0) 2020.04.06 [백준] 2636번 치즈 (0) 2020.04.06 [백준] 9205번 맥주 마시면서 걸어가기 (0) 2020.04.05