반응형
https://www.acmicpc.net/problem/7785
2018.11.17 1차시도 - 시간초과
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
const size_t size{26};
vector<vector<string> > log;
unsigned int n;
cin >> n;
while (n--)
{
string name, condition;
cin >> name >> condition;
int point = name[0] - 65;
if (!(0 <= point && point < 91))
{
point = point - 32;
}
if (condition == "enter")
{
log[point].push_back(name);
}
else
{
vector<string>::iterator iter = find(log[point].begin(), log[point].end(), name);
if (iter != log[point].end())
{
log[point].erase(iter);
}
}
}
for (int i = 0; i < 26; i++)
{
sort(log[i].begin(), log[i].end());
}
for (int i = 0; i < 26; i++)
{
while (log[i].size())
{
cout << log[i].back() << endl;
log[i].pop_back();
}
}
return 0;
}
애초에 106개의 기록이 주어진다는 것과 사람의 이름을 사전 순의 역순으로 한 줄에 한 명씩 출력해야 한다는 점에서 sort()를 쓰면 시간 초과가 나지 않을까 싶어서 나름 고민한다고 고민해서 vector로 2차원 배열을 만들어서 첫 번째 글자를 통해 A~Z까지 나눈 다음 2차원...뭐라하지 어쨌든 거기에 이름을 나눠 담고 따로 정렬한 다음에 따로 출력하려고 했었다. 한 vector에 이름을 싹 다 넣으면 찾는데도 시간이 오래 걸릴 것이고, 정렬하는데도 시간이 오래 걸릴 것 같아서 나름 생각한 방법인데 글 쓰면서 생각해 보니까 도긴개긴이라는 말이 떠오른다.
vector > 식별자이름;
> > 여기 사이에 빈칸이 굉장히 중요하다. 빈칸 없이 >>라고 하면 컴파일러가 shift연산자로 인식해서 컴파일시 에러를 출력한다.
iterator 사용, 의 find()사용
vector::iterator iter = find(log[point].begin(), log[point].end(), name);
만약, 원하는 벡터에서 원하는 값을 찾지 못한 경우, iter에는 구간의 끝값(.end())값이 저장된다.
읭 그럼 만약 구간의 끝값이 찾는 값이면 어떡하지?
#include 하면 greater<자료형>() 함수가 있는데, 이걸 sort할때
sort(처음, 끝, greater()); 이렇게 쓰면 손 쉽게 역순 정렬을 할 수 있다.
vector.pop_back() -> pop해서 없애버림
vector.back() -> 맨 끝 값 return
반응형
'잡다한 시도 > 코테 준비는 하는거니?' 카테고리의 다른 글
[BOJ] 2875번: 대회 or 인턴 (0) | 2019.03.30 |
---|---|
[BOJ] 11721번: 열 개씩 끊어 출력하기 (0) | 2018.11.19 |
[BOJ] 1764번: 듣보잡 (0) | 2018.11.18 |
[BOJ] 2941번: 크로아티아 알파벳 (0) | 2018.11.18 |
[BOJ] 16499번: 동일한 단어 그룹화하기 (0) | 2018.11.18 |