Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[맵과 셋] 03월 14일 #2

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions 03월_08일-맵과셋/20291.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

// 결과는 나오지만, 틀렸습니다!!

Comment on lines +7 to +9
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사소한 실수가 있네요! 디버깅 시 사용한 코드를 확인해주세요 😉

int main() {
//입력
//(1<= n <= 50,000)
//(3<= filename <= 100)
int n;
cin >> n;

map<string, int> file;
vector<string> ext;

//연산
//1. 확장자 분리하기
//2. 확장자 개수 세고 사전 순 정렬(오름차순)
//3. 개수와 확장자명을 사전 순 출력
while(n--){
string file_name;
cin >> file_name;

//1. 확장자 분리하기
file_name.erase(0, file_name.find('.') + 1);
ext.push_back(file_name);
}

//2. 확장자 정렬한 뒤 개수 세기
sort(ext.begin(), ext.end());
for(int i=0; i < ext.size(); i++) {
cout << ext[i] << "\n";
}

int cnt = 0;
string tmp = ext[0];

for(int i=0; i < ext.size(); i++) {

if (tmp == ext[i]){
cnt ++;
} else {
// 확장자가 다를 때, 그동안 셌던 cnt를 map에 넣음
file[ext[i-1]] = cnt;
cnt = 1;
tmp = ext[i];
}

}
//맨 마지막 넣기
file[tmp] = cnt;


//3. 확장자 수와 이름을 사전 순 출력
map<string, int>::iterator iter;
for(auto iter : file){
cout << iter.first << " " << iter.second << '\n';
}

return 0;
}
36 changes: 36 additions & 0 deletions 03월_08일-맵과셋/2776.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include <iostream>
#include <unordered_set>
#include <vector>

using namespace std;

//시간초과

Comment on lines +6 to +8
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

우선 unordered_set 을 사용해서 풀이해주신 건 아주 좋아요! 🥰 해당 문제의 경우에도 입력이 조금 많아보이네요. c++의 cin, cout은 c보다 느리다고 했었죠. 이때 입출력 속도 향상을 해 줄 수 있는 방법이 무엇이었죠?

int main()
{
//입력 (1<=N<=1,000,000, 1<=M<=1,000,000)
int t, n, m, input;
unordered_set<int> note;

cin >> t;
while (t--){
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트케이스마다의 수첩 내용이 누적되고 있네요!

cin >> n;
for (int i = 0; i < n; i++)
{
cin >> input;
note.insert(input);
}
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> input;
//탐색하면서 입력한 것과 같은 수가 나오면 1 아니면 0
if (note.find(input) != note.end()){
cout << "1\n";
} else {
cout << "0\n";
}
}
}

}
49 changes: 49 additions & 0 deletions 03월_08일-맵과셋/9375.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

int main() {
//입력 (t <100, 0<=n<=30)
int t, n;
cin >> t;


map <string, int> :: iterator iter;

//연산
// 같은 종류의 의상은 하나만 있어야 한다.
// 1. 종류 별로 count하고 경우의 수를 계산한다.
// 2. 경우의 수는 0개, 1개, ..., n-1개, n개 이므로 (n+1) * (n+1) - 1(알몸)이다.

while(t--){
cin >> n;
map <string, int> clothes; // 기존 내용 삭제
while(n--){
string category, name;
cin >> name >> category;

//find 함수는 찾는 key가 없으면 end를 return한다.
if (clothes.find(category) == clothes.end()) {
clothes[category] = 1;
} else {
clothes[category]++;
}
}

int sum = 1;
for( auto iter : clothes){
sum *= (iter.second + 1) ;
}

sum -= 1;

cout << sum << "\n" ;
}



return 0;
}