<링크>
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-K && 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 |