https://www.acmicpc.net/problem/14725
생각 흐름
- 한 줄 한 줄에 대해 정렬을 하면 출력에 나와야 하는 순서대로 정렬되는 것을 확인
- map<string, bool> m[15]을 사용하여 나왔던 문자인지 확인해준다. 예를 들어 m[1]["BANANA"]의 값을 확인해서 1 depth에 BANANA가 나왔던 적이 있는지 확인한다.
- 만약 BANANA가 나왔었으면 무시해주고, 안 나왔으면 출력해준다.
- 만약 어떤 depth의 첫 문자에서 다른 문자로 바꼈으면 m을 해당 depth부터 초기화 해준다. 예를 들어 첫 문자열 중 depth 1에서 첫 문자가 A인데 다음 문자열의 depth 1인 값이 B이면 m을 초기화 해줘야 한다.
- 왜냐하면 새로운 가지가 생기는 것이므로 depth에서 중복된 것이 나올 수 있으므로 기존의 m에 저장되어있던 true를 지워줘야 한다.
더 좋은 방법이 있을 거 같아서 다른 풀이를 봤는데 구조체를 만들어서 하면 더 쉽게 풀 수 있다.
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <memory.h>
#include <set>
#include <algorithm>
#define endl '\n'
using namespace std;
int N;
vector<string> v[1000];
map<string, bool> m[15];
bool comp(vector<string> a, vector<string> b){
long minSize = min(a.size(), b.size());
for(int i = 0; i<minSize; i++){
if(a[i]==b[i]) continue;
return a[i]<b[i];
}
return a.size()<b.size();
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>N;
for(int i = 0; i<N; i++){
int n;
cin>>n;
for(int j = 0; j<n; j++) {
string s;
cin>>s;
v[i].push_back(s);
}
}
sort(v, v+N, comp);
vector<string> first(15);
for(int i = 0; i<N; i++){
for(int j = 0; j<v[i].size(); j++){
if(first[j].empty()){
first[j] = v[i][j];
} else {
if(first[j]!=v[i][j]){
first[j]=v[i][j];
for(int h = j; h<15; h++){
m[h].clear();
}
}
}
if(m[j][v[i][j]]){
continue;
}
else {
m[j][v[i][j]] = true;
for(int h = 0; h<j; h++){
cout<<"--";
}
cout<<v[i][j]<<endl;
}
}
}
return 0;
}
'코딩테스트 > C++' 카테고리의 다른 글
[ 백준 BOJ ] 1025번 - 제곱수 찾기 (C++) (0) | 2025.03.25 |
---|---|
[ 백준 BOJ ] 1013번 - Contact (C++) (0) | 2025.03.24 |
[ 백준 BOJ ] 2533번 - 사회망 서비스(SNS) (C++) (2) | 2025.03.15 |
[ 백준 BOJ ] 28707번 - 배열 정렬 (C++) (0) | 2025.03.11 |
[ 백준 BOJ ] 15681번 - 트리와 쿼리 (C++) (0) | 2025.03.09 |