여니의 취준 준비/코딩테스트 (Java)

[15787] 기차가 어둠을 헤치고 은하수를 in Java

여니's 2022. 8. 18. 21:01

https://www.acmicpc.net/problem/15787

 

15787번: 기차가 어둠을 헤치고 은하수를

입력의 첫째 줄에 기차의 수 N(1 ≤ N ≤ 100000)과 명령의 수 M(1 ≤ M ≤ 100000)가 주어진다. 이후 두 번째 줄부터 M+1번째 줄까지 각 줄에 명령이 주어진다. 

www.acmicpc.net


문제 요약

 
기차 개수 : N개
좌석 수 :20개
명령 개수 : M개
 
명령 종류 4가지
1. i번째 기차, x번째 좌석에 사람 태우기 (이미 사람 있으면 x)
2. i번째 기차, x번째 좌석에 앉은 사람 하차 (사람이 없으면 x)
3. i번째 기차, k번째 앉은 사람 -> k+1번째로 고객 모두 이동, 단 20번째 자리에 사람이 앉아 있었다면 이 사람은 하차한다.
4. i번째 기차, k번째 앉은 사람 -> k-1번째로 고객 모두 이동, 단 1번째 자리에 사람이 앉아 있었다면 하차
 
기차별로 배치가 다 달라야한다.

 

만약 1번 기차에 앉은 좌석 배치와 3번 기차에 앉은 좌석 배치 순서가 같다면, 3번 기차는 은하수를 건널 수 없다.
 

문제 접근 방식

간단한 구현 문제였다.

 


시행 착오

3번, 4번 명령을 실행할 때

아래와 같이 로직을 작성했다

분명히 맞게 입력했는데

왜 안될까 곰곰히 생각해보니

오류가 있다는 걸 깨달았다.

 

3번 명령어가 실행되면

k번째 앉아 있는 사람이 k+1번째로 이동하게 된다.

앞에서부터 값을 변경시키면

원본 값이 아닌 이미 변경된 값으로 

값이 주입이 된다.

 

그래서 이때는 거꾸로 끝에서부터 진행을 해줘야한다.

 

4번 명령어에서는 3번 명령어와는 반대로

앞에서부터 진행해주면

문제 없이 코드가 실행된다.

 


소스코드

 

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
 
public class Main {
    static int N;
    static int M;
    static boolean[][] trainArr;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N=Integer.parseInt(st.nextToken()); // 기차의 개수
        M=Integer.parseInt(st.nextToken()); // 명령의 개수
        trainArr=new boolean[N+1][21]; // 1~20번 좌석
        
        for (int i = 0; i < M; i++) {
            // 명령 번호, 기차 번호, 좌석 번호
            st=new StringTokenizer(br.readLine());
            int mNum=Integer.parseInt(st.nextToken());
            int trainNum=Integer.parseInt(st.nextToken());
            
            if (mNum==1) { // i번째 기차, x번째 좌석에 사람 태우기 (이미 사람 있으면 x)
                int seatNum=Integer.parseInt(st.nextToken());
                trainArr[trainNum][seatNum]=true;
                
            }else if(mNum==2) { // i번째 기차, x번째 좌석에 앉은 사람 하차 (사람이 없으면 x)
                int seatNum=Integer.parseInt(st.nextToken());
                trainArr[trainNum][seatNum]=false;
                
            }else if(mNum==3) { // k번째 앉은 사람 -> k+1번째로 고객 모두 이동
                for (int j = 20; j >=2 ; j--) {
                    trainArr[trainNum][j]=trainArr[trainNum][j-1];
                }
                trainArr[trainNum][1]=false;
            }else if(mNum==4){ // k번째 앉은 사람 -> k-1번째로 고객 모두 이동
                for (int j = 1; j <20; j++) {
                    trainArr[trainNum][j]=trainArr[trainNum][j+1];
                }
                trainArr[trainNum][20]=false;
            }
        }
        Set<String> set = new HashSet<>();
        
        for (int i = 1; i <= N; i++) {
            String temp="";
            for (int j = 1; j <= 20; j++) {
                if(trainArr[i][j]) temp+="1";
                else temp+="0";
            }
            set.add(temp);
        }
        System.out.println(set.size());
    }
}
cs