Post

백준 - 2002번, 추월

[Silver I] 추월 - 2002

문제 링크

1. 문제 설명

대한민국을 비롯한 대부분의 나라에서는 터널 내에서의 차선 변경을 법률로 금하고 있다. 조금만 관찰력이 있는 학생이라면 터널 내부에서는 차선이 파선이 아닌 실선으로 되어 있다는 것을 알고 있을 것이다. 이는 차선을 변경할 수 없음을 말하는 것이고, 따라서 터널 내부에서의 추월은 불가능하다.

소문난 명콤비 경찰 대근이와 영식이가 추월하는 차량을 잡기 위해 한 터널에 투입되었다. 대근이는 터널의 입구에, 영식이는 터널의 출구에 각각 잠복하고, 대근이는 차가 터널에 들어가는 순서대로, 영식이는 차가 터널에서 나오는 순서대로 각각 차량 번호를 적어 두었다.

N개의 차량이 지나간 후, 대근이와 영식이는 자신들이 적어 둔 차량 번호의 목록을 보고, 터널 내부에서 반드시 추월을 했을 것으로 여겨지는 차들이 몇 대 있다는 것을 알게 되었다. 대근이와 영식이를 도와 이를 구하는 프로그램을 작성해 보자.

1.1 입력

입력은 총 2N+1개의 줄로 이루어져 있다. 첫 줄에는 차의 대수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 대근이가 적은 차량 번호 목록이 주어지고, N+2째 줄부터 N개의 줄에는 영식이가 적은 차량 번호 목록이 주어진다. 각 차량 번호는 6글자 이상 8글자 이하의 문자열로, 영어 대문자(‘A’-‘Z’)와 숫자(‘0’-‘9’)로만 이루어져 있다.

같은 차량 번호가 두 번 이상 주어지는 경우는 없다.

1.2 출력

첫째 줄에 터널 내부에서 반드시 추월을 했을 것으로 여겨지는 차가 몇 대인지 출력한다.

2. 풀이

2.1 요구사항 정리

터널 안으로 차량들이 들어간다. 그렇게 들어간 차량들 중 몇몇의 차량이 터널 안에서 추월을 한다.

  1. 터널 밖으로 나오는 차량 순서를 보고 반드시 추월을 한 것으로 볼 수 있는 차량 수를 출력하라.

2.2 풀이 논리

들어간 순서대로 나오면 추월은 한 것이 아니고, 들어간 순서와 다르게 나오는 차량이 있으면 그 차량은 추월한 것이므로 차 번호를 원소로 갖는 큐를 사용해 들어가는 순서대로 차량을 저장하고, 순서가 맞지 않을 때마다 카운트해서 카운트 값을 출력한다.

카운트를 세는 논리는 아래와 같다.

  1. 큐의 맨 앞 차량 번호와 터널에서 나온 차량 번호가 일치하지 않는다면, 일치할 때까지는 계속 추월한 차량이 나오는 것이므로 큐에서 remove() 해주고 카운트를 올린다.
  2. 큐의 맨 앞 차량 번호와 터널에서 나온 차량 번호가 일치한다면, 들어간 순서대로 나온 것이므로 카운트를 세지 않고 poll() 해서 다음 순서의 차량을 큐의 맨 앞에 위치시킨다.

2.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
import java.io.*;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        // FIFO 로 차 번호를 확인하기 위해 큐 객체 사용
        Queue<String> q = new LinkedList<>();
        for (int i = 0; i < N; i++) {
            q.offer(br.readLine());
        }

        int answer = 0;
        // 터널에서 나오는 차 번호가 FIFO 순서와 맞지 않을 때마다 카운트
        for (int i = 0; i < N; i++) {
            String out = br.readLine();
            if (!q.peek().equals(out)) {
                q.remove(out);
                answer++; // 풀이 논리 2번
            }
            else q.poll(); // 풀이 논리 1번
        }
        System.out.print(answer);
    }
}
This post is licensed under CC BY 4.0 by the author.