🖥️ 오늘의 백준
백준 2776번 : 암기왕 [C++]
무콩이
2023. 4. 2. 14:35
2776번 : 암기왕
2776번: 암기왕
연종이는 엄청난 기억력을 가지고 있다. 그래서 하루 동안 본 정수들을 모두 기억 할 수 있다. 하지만 이를 믿을 수 없는 동규는 그의 기억력을 시험해 보기로 한다. 동규는 연종을 따라 다니며,
www.acmicpc.net
접근법
- 수첩 1에 적은 숫자들 저장
- 수첩 2에 적은 숫자들과 수첩 1에 적은 숫자들 비교
- find, count 함수등 있다, 없다를 판별하는 함수 사용
- 있다면 1, 없다면 0 출력
코드 1
#include <iostream>
#include <vector>
using namespace std;
int main() {
int T;
cin >> T;
for (int t = 0; t < T; t++) {
int n;
cin >> n;
vector<int> note1; //note1에 적힌 숫자들
for (int i = 0; i < n; i++) {
int num;
cin >> num;
note1.push_back(num);
}
int m;
cin >> m;
vector<int> note2; //note2에 적힌 숫자들
for (int i = 0; i < m; i++) {
int num;
cin >> num;
note2.push_back(num);
}
for (int i = 0; i < m; i++) {
if (count(note1.begin(), note1.end(), note2.at(i)) == 0) {
cout << "0";
}
else {
cout << "1";
}
cout << "\n";
}
}
return 0;
}
시간초과 : 시간복잡도 O(T * m * n)
원인 : m,n이 커지게 되면 시간 복잡도 매우 증가하게됨
해결방안
해결 방법
: note1의 숫자를 벡터말고 set에 넣기, 이후 note2의 숫자를 찾기
- set에 저장
set<int> note1; //벡터와 생성방법 동일
cin >> num;
note1.intsert(num); //push_back 아닌 insert로 삽입
- note2의 숫자 note1 set에서 숫자 찾기
cin >> note2_num; //note2의 숫자들 하나씩 입력
if(note1.find(note2_num) == note2_num.end()){
//set에서 찾지 못한 경우 set의 end값을 반환함
cout << "0";
else{
cout << "1";
}
🔽 set으로 고쳤는데도 .. 시간초과 뜬다
#include <iostream>
#include <set>
using namespace std;
int main() {
int T;
cin >> T;
for (int t = 0; t < T; t++) {
int n;
cin >> n;
set<int> note1; //note1에 적힌 숫자들
for (int i = 0; i < n; i++) {
int num;
cin >> num;
note1.insert(num);
}
int m;
cin >> m;
for (int i = 0; i < m; i++) {
int num;
cin >> num;
if (note1.find(num) == note1.end()) {
//해당 원소가 없는 경우
cout << "0";
}
else { //원소가 있는 경우
cout << "1";
}
cout << "\n";
}
}
return 0;
}
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
추가했더니 성공!!
전체코드
#include <iostream>
#include <set>
using namespace std;
int main() {
int T;
cin >> T;
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
for (int t = 0; t < T; t++) {
int n;
cin >> n;
set<int> note1; //note1에 적힌 숫자들
for (int i = 0; i < n; i++) {
int num;
cin >> num;
note1.insert(num);
}
int m;
cin >> m;
for (int i = 0; i < m; i++) {
int num;
cin >> num;
if (note1.find(num) == note1.end()) {
//해당 원소가 없는 경우
cout << "0";
}
else { //원소가 있는 경우
cout << "1";
}
cout << "\n";
}
}
return 0;
}