[백준] 3048 개미 JavaScript

·2024년 5월 30일

문제

개미가 일렬로 이동할 때, 가장 앞의 개미를 제외한 나머지 개미는 모두 앞에 개미가 한 마리씩 있다.

서로 반대 방향으로 이동하던 두 개미 그룹이 좁은 길에서 만났을 때, 개미는 어떻게 지나갈까?

최근 연구에 의하면 위와 같은 상황이 벌어지면 개미는 서로를 점프해서 넘어간다고 한다.

즉, 두 그룹이 만났을 때, 1초에 한번씩 개미는 서로를 뛰어 넘는다. (한 개미가 다른 개미를 뛰어 넘고, 다른 개미는 그냥 전진한다고 생각해도 된다)

하지만 모든 개미가 점프를 하는 것은 아니다. 자신의 앞에 반대 방향으로 움직이던 개미가 있는 경우에만 점프를 하게 된다.

첫 번째 그룹이 ABC로 움직이고, 두 번째 그룹의 개미가 DEF순으로 움직인다고 하자. 그럼, 좁은 길에서 만났을 때, 개미의 순서는 CBADEF가 된다. 1초가 지났을 때는 자신의 앞에 반대방향으로 움직이는 개미가 있는 개미는 A와 D다. 따라서, 개미의 순서는 CBDAEF가 된다. 2초가 되었을 때, 자신의 앞에 반대 방향으로 움직이는 개미는 B,D,A,E가 있다. 따라서, 개미의 순서는 CDBEAF가 된다.

T초가 지난 후에 개미의 순서를 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 첫 번째 그룹의 개미의 수 N1과 두 번째 그룹의 개미의 수 N2가 주어진다.

다음 두 개 줄에는 첫 번째 그룹과 두 번째 그룹의 개미의 순서가 주어진다. 각 개미는 알파벳 대문자로 표현할 수 있으며, 두 그룹에서 중복되는 알파벳은 없다.

마지막 줄에는 T가 주어진다. (0 ≤ T ≤ 50)

출력

T초가 지난 후에 개미의 순서를 출력한다. 첫 번째 개미 그룹은 왼쪽에서 오른쪽으로 움직이고, 두 번째 그룹은 반대 방향으로 움직인다.

예제 입력

3 3
ABC
DEF
2

예제 출력

CDBEAF

내가 했던 풀이 방법

  1. 첫 번째로 입력받은 개미 그룹을 분할하여 2차원 배열에 [문자, "left"]로 저장해주고, 두 번째로 입력받은 개미 그룹을 같은 방법으로 [문자, "right"]로 저장해준다.
  2. 첫 번째 개미 배열을 reverse 해주고, 두 번째 개미 배열과 합쳐준다.
  3. 0부터 합쳐진 개미 배열의 length-1까지 j를 증가시키면서 ants[j][1]이 left이고, ants[j+1][1]이 right일 경우, 두 개미를 배열 디스트럭처링을 이용하여 swap해준다. 해당 개미는 점프했기 때문에 해당 시간에는 더이상 움직일 수 없으므로, j를 1증가시켜준다. (length-1까지 하는 이유는 index를 벗어나지 않게 하기 위해서이고, left가 점프하고 right는 항상 지나간다는 가정으로 풀이한다. j를 1 증가시켜주는 이유는 2-3번 개미가 swap 되었을 때 다음으로 3번 위치를 검사하게 된다. 하지만 이미 swap되어 3-2가 되었기 때문에 2번개미가 다시 검사되게 된다. 이럴 경우 두 번 움직이게 되어 문제에 조건과 다르게 된다.) 이를 T초만큼 반복해준다.
  4. 모든 연산이 끝난 뒤, 배열을 순서대로 문자만 출력해준다.

코드

const fs = require('fs');
let [n, left, right, T] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

T = Number(T);
left = left
  .trim()
  .split('')
  .map((value) => [value, 'left']);
right = right
  .trim()
  .split('')
  .map((value) => [value, 'right']);

left.reverse();
let ants = left.concat(right);

for (let i = 0; i < T; i++) {
  for (let j = 0; j < ants.length - 1; j++) {
    if (ants[j][1] === 'left' && ants[j + 1][1] === 'right') {
      [ants[j], ants[j + 1]] = [ants[j + 1], ants[j]];
      j++;
    }
  }
}

let answer = '';
for (let i = 0; i < ants.length; i++) {
  answer += ants[i][0];
}
console.log(answer);

회고

개미가 어느쪽 개미였는지만 기억하면 풀이할 수 있을 것 같아 2차원 배열을 생각했다. 문제를 보면 어려울 것 같긴한데 방법만 생각해내면 어렵지 않게 풀 수 있던 문제.

profile
Frontend🍓

0개의 댓글