Priceless

[백준] 13414번: 수강신청 (C++) 본문

Algorithm & Test/백준

[백준] 13414번: 수강신청 (C++)

Hyun__ 2023. 9. 29. 14:19

 

 

list와 map 라이브러리를 불러온 후 작성한다

 

list의 동적 할당을 위해 크기를 미리 선언하지 않는다

미리 선언하면 end 접근할 때 0으로 모두 초기화되어 

원하지 않은 출력 값이 나타날 수 있다

 

우선 학번을 입력 받기 위한 list인 student를 선언한다

그리고 student의 iterator를 매핑하는 map인 student_map을 선언한다

 

반복문에서 학번을 한 명씩 입력 받은 후

반복자 iter를 초기화한다

map을 통해 입력 받은 학번이 이미 수강신청을 했는지 확인한 후 

이미 수강신청을 했다면 기존 수강신청 정보를 지운다

이후 입력 받은 수강신청 정보를 list 와 map 뒤에 추가한다

 

이후 정렬된 코드를 수강신청 제한 인원에 맞게 list를 자른 후

출력 형식을 조절하여 출력한다

 

  1. int input; cin >> input;: 먼저, 학생 번호를 입력받습니다. 이 학생이 수강을 신청하는 학생입니다.
  2. auto iter = student.end();: student 리스트의 끝을 가리키는 반복자 iter를 생성합니다. 처음에는 이 학생이 student 리스트의 끝에 위치한 것으로 가정합니다.
  3. if (student_map.find(input) != student_map.end()): 학생 번호인 input이 이미 student_map에 존재하는지 확인합니다. 존재한다면, 해당 학생은 이미 수강을 신청한 상태입니다.
  4. student.erase(student_map.find(input)->second);와 student_map.erase(input);: 이미 수강한 학생을 다시 수강한 경우를 처리합니다. student_map에서 해당 학생의 위치를 찾아서 student 리스트에서 삭제하고, 그 학생의 정보를 student_map에서도 삭제합니다.
  5. student.push_back(input);: 수강을 신청한 학생을 student 리스트의 맨 뒤에 추가합니다.
  6. student_map.insert({input, --iter});: 새로운 학생 정보를 student_map에 추가합니다. 이때, --iter를 사용하여 student 리스트의 맨 뒤에 추가되었으므로, 이 학생을 가리키는 반복자를 student_map에 매핑합니다.

 

// baekjoon 13414

#include<iostream>
#include<list>
#include<map>
using namespace std;

// codes for fast I/O
void init(){
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);
}

using namespace std;

list<int> student;

int main(){
    int N, K;
    cin >> N >> K;
    
    
    map<int, list<int>::iterator> student_map;
    
    while(K--){
        int input;
        cin >> input;
        
        auto iter = student.end();
        
        if (student_map.find(input) != student_map.end()) {
            student.erase(student_map.find(input)->second);
            student_map.erase(input);
        }
        
        student.push_back(input);
        student_map.insert({input, --iter});
    }

    
    if(student.size() > N){
        student.resize(N);
    }

    for(auto i = student.begin(); i != student.end(); i++){
        cout.width(8);
        cout.fill('0');
        cout << *i << '\n';
    }
    
}