<링크>

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


<소스코드>

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
#include<stdio.h>
#include<vector>
#include<set>
#include<iostream>
#include<string>
using namespace std;
set<string> s;
vector<string> seq;
vector<string> list;
int main()
{
    char buf[10];
    int K, L;
    scanf("%d%d"&K, &L);
    for (int l = 0; l < L; ++l)
    {
        string str;
        cin >> str;
        list.push_back(str);
    }
    for(int l=L-1;l>=0;--l)
    {
        string str = list[l];
        if (s.find(str) == s.end())
        {
            s.insert(str);
            seq.push_back(str);
        }
    }
 
    int size = seq.size();
    for (int i = size-1; i >=size-&& i>=0--i)
        cout << seq[i]<<"\n";
}
cs


<풀이>

일단 들어온 학번들을 쫙 저장해놓고 맨 뒤부터 확인한다.

여러번 나온 같은 학번중, 앞에나온 학번은 의미가 없고 맨 마지막에나온 학번만 의미가 있기 때문이다.

맨뒤부터

set에 없으면 set에 넣어주고 리스트에도 넣어준다. 

set에 있으면 그냥 지나친다.

1

2

3

2

순으로 들어왔으면

뒤부터 2,3,1이 list에 들어가게 된다.

결국 리스트에는 꼴찌부터 1등까지의 목록이 남게된다.

그럼 다시 리스트의 끝에서부터 K개만 출력해야 1등부터 K등까지 출력된다.

이 때, K가 총 수강신청학생보다 클수있으므로 주의해야한다.

10명 제한인데 4명만 신청했으면 1,2,3,4등 다 수강신청하게 해줘야하기 때문이다.

'알고리즘 풀이 > 기타' 카테고리의 다른 글

백준 8979 올림픽  (0) 2018.08.29
백준 2621 카드게임  (0) 2018.08.28
백준 13413 오셀로 재배치  (0) 2018.08.01
백준 10973 이전 순열  (0) 2018.07.24
백준 10972 다음 순열  (1) 2018.07.24

+ Recent posts