안드 공부를 해볼까?

[Java] 백준 기차가 어둠을 헤치고 은하수를 본문

알고리즘/백준

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

문바리 2022. 8. 16. 21:58
728x90

1. 문제분석

 

문제는 생각보다 간단하다. 각 명령어에 맞게 변경해주면 되고 구현만 하면 끝이다.

이 문제는 3, 4번을 구현할 때 비트마스킹으로 구현한다고 한다.

비트마스킹이 정말 뭔지 모르기 때문에 이 포스팅에서는 단순 for문으로 구현했다.

 

1번과 2번은 정말 쉽게 구현할 수 있으니 넘어가겠다.

3번 같은 경우는 승객이 한칸씩 밀리고 마지막에 20번째에 사람이 있다면 하차를 한다.

단순히 for문으로 arr[기차][자리] = arr[기차][전의 자리(자리 - 1)]해주면 끝이다.

 

4번은 승객을 한칸씩 앞으로 댕기고 1번째의 자리에 있다면 하차한다.

마찬가지로 arr[기차][자리] = arr[기차][앞자리 (자리 +1)]하면 된다.

 

그 다음 조건을 보자. 이미 존재하는 기차가 있다면 그 기차는 통과하지 못한다.

1번과 3번의 좌석이 똑같으므로 같은 기차로 포함된다. 즉, 3번은 통과하지 못한다.

나는 String으로 변환 후 HashSet에 넣어서 중복을 제거했다.

마지막에 HastSet의 크기를 반환하면 끝이다.

2. 구현

import java.io.*;
import java.nio.Buffer;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int trainCount = Integer.parseInt(st.nextToken());
        int operation = Integer.parseInt(st.nextToken());

        int[][] train = new int[trainCount + 1][21];

        for (int i = 0; i < operation; i++) {
            st = new StringTokenizer(br.readLine());
            int currentOperation = Integer.parseInt(st.nextToken());
            int trainPos, seatPos;
            switch (currentOperation) {
                case 1:
                    trainPos = Integer.parseInt(st.nextToken());
                    seatPos = Integer.parseInt(st.nextToken());
                    train[trainPos][seatPos] = 1;
                    break;
                case 2:
                    trainPos = Integer.parseInt(st.nextToken());
                    seatPos = Integer.parseInt(st.nextToken());
                    train[trainPos][seatPos] = 0;
                    break;
                case 3:
                    trainPos = Integer.parseInt(st.nextToken());
                    for (int j = 20; j >= 2; j--) {
                        train[trainPos][j] = train[trainPos][j - 1];
                    }
                    train[trainPos][1] = 0;
                    break;
                case 4:
                    trainPos = Integer.parseInt(st.nextToken());
                    for (int j = 1; j <= 19; j++) {
                        train[trainPos][j] = train[trainPos][j + 1];
                    }
                    train[trainPos][20] = 0;
                    break;
            }
        }
        HashSet<String> set = new HashSet<>();

        for (int j = 1; j <= trainCount; j++) {
            String temp = "";
            for (int k = 1; k <= 20; k++) {
                temp += train[j][k];
            }
            set.add(temp);
        }
        System.out.println(set.size());
    }
}

정말 위에서 말한거 처럼 구현하면 끝이다.

구현 문제가 정말 간단하지만 생각하는데 어려움이 있다.

3. 마무리

구.현.문.제.조.아

실버 2문제라는데 생각보다 쉬웠다.

반응형
Comments