본문으로 바로가기

[백준] 3048번 : 개미

category 알고리즘/백준 2022. 2. 2. 10:06
728x90

 

문제

 

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

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

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

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

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

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

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

 

입력

 

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

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

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

 

출력

 

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

 

 

풀이 방법

 

첫번째 그룹이 ABC, 두번째 그룹이 DEF일 때 개미의 순서는 CBADEF가 된다고 했으므로 첫번째 그룹은 역순으로 순서를 연결시켜 주면 된다.

 

또한, 두 개의 그룹은 서로 반대 방향으로 이동하므로 입력시 서로 다른 그룹이라는 것을 나타내기 위해 문자와 번호그룹을 같이 입력하는 Ant 클래스를 선언하였다.

 

첫번째 그룹의 역순과 두번째 그룹을 연결시켜 준 뒤, 이 그룹에서 연속되는 두 개의 수를 출력하여 서로 다른 그룹에 속했을 경우, 순서를 변경시켜주면 된다. 이를 T초만큼 반복하기 위해 while문으로 선언하였다.

 

서로 다른 그룹 지정을 위해 문자와 함께 번호를 입력하는 클래스 선언으로써 그룹을 나누는 아이디어를 기억해야겠다.

 

작성 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package baekjoon.Implementation;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
 
public class BJ_3048 {
 
    static ArrayList<Ant> list=new ArrayList<>();
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(br.readLine());
 
        int N1=Integer.parseInt(st.nextToken());
        int N2=Integer.parseInt(st.nextToken());
 
        String s1=br.readLine();
        String s2=br.readLine();
        int T=Integer.parseInt(br.readLine());
 
        for(int i=s1.length()-1;i>=0;i--){
            list.add(new Ant(s1.charAt(i),1));
        }
 
        for(int i=0;i<s2.length();i++){
            list.add(new Ant(s2.charAt(i),2));
        }
 
        while (T-->0){
            for(int i=0;i<list.size()-1;i++){
                Ant now = list.get(i);
                Ant next = list.get(i + 1);
                if(now.num!= next.num){
                    list.set(i,next);
                    list.set(i+1,now); // SWAP
                    i++;
                }
            }
        }
 
        for(int i=0;i<list.size();i++){
            System.out.print(list.get(i).ch);
        }
 
    }
 
    public static class Ant{
 
        char ch;
        int num;
 
        public Ant(char ch, int num){
            this.ch=ch;
            this.num=num;
        }
    }
}
 
 
 

 

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1063번 : 킹  (0) 2022.02.02
[백준] 2980번 : 도로와 신호등  (0) 2022.02.02
[백준] 16943번 : 숫자 재배치  (0) 2022.01.28
[백준] 8979번 : 올림픽  (0) 2022.01.26
[백준] 1476번 : 날짜 계산  (0) 2021.12.22