알고리즘/문제 풀이

백준 2002 - 추월(C++)

qqlzzb 2022. 8. 15. 15:29

문제 https://www.acmicpc.net/problem/2002

 

2002번: 추월

입력은 총 2N+1개의 줄로 이루어져 있다. 첫 줄에는 차의 대수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 대근이가 적은 차량 번호 목록이 주어지고, N+2째 줄부터 N개의 줄에는 영식이

www.acmicpc.net

 

풀이

map 사용하는 문제에 재미 들렸다 ㅎ

먼저 map에 입력되는 차량 번호와 순서(0~n의 값을 갖는 각 차량의 번호표)를 저장한다.

추월하지 않았다면 들어와야 했을 번호를 idx에 저장한다.

배열을 생성해서 차가 터널에서 나가면 앞서 저장한 번호표에 해당하는 인덱스로 가서 1을 입력한다.

(3번 번호표를 갖는 차가 나가면 arr[3]의 값을 1로 변경. 이 과정이 없으면 이미 나간 3번 차례를 계속 기다리게 될 수 있다.)

idx부터 시작해서 배열의 값이 1인 동안 idx를 계속 증가시킨다. (배열의 값이 1이면 이미 빠져나간 차이므로) 

현재 나가는 차가 idx와 다르다면 추월을 한 차일 것이므로 cnt를 증가한다.

코드

#include <iostream>
#include <map>
#include <string>
using namespace std;
int arr[1001];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    map<string,int> m;
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        string s;
        cin>>s;
        m.insert({s,i});
    }
    int idx=0, cnt=0;
    for(int i=0; i<n; i++)
    {
        string s;
        cin>>s;
        while(arr[idx]!=0 && idx<n) idx++;
        arr[m[s]]=1;
        if(m[s]!=idx) cnt++;
        else idx++;
    }
    cout<<cnt;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

SWEA 7701 - 염라대왕의 이름 정렬(C++)  (0) 2022.09.02
백준 18870 - 좌표 압축(C++)  (0) 2022.08.27
백준 13414 - 수강신청(C++)  (0) 2022.08.14
SWEA - 힙 (STL 사용 X)  (0) 2022.08.09
SWEA - 공통조상 (C++)  (0) 2022.08.04