문제 요약
포켓몬 마스터가 되기 위한 도감 완성.
입력
도감에 기록된 포켓몬의 개수 N개 맞춰야 하는 문제의 개수 M개.
1 <= N, M <= 100,000 (자연수)
이후 번호가 1번인 포켓몬부터 N번에 해당하는 포켓몬 이름이 한 줄에 하나씩 입력으로 들어옴.
첫 글자는 대문자이며 일부 마지막 문자는 대문자이다. 이름은 알파벳으로만 이루어져 있음. ( 2 <= s <= 20)
이후 다음 줄부터 M개의 맞춰야하는 문제가 입력으로 들어옴.
출력
알파벳으로만 들어오면 포켓몬 번호를 말해야 하고, 숫자로만 들어오면 포켓몬 이름을 출력한다.
풀이
문자를 숫자로, 숫자를 문자로 변환하는 문제이다.
이럴 때 우리는 atoi 함수를 활용해볼 수 있다. ( 0인 경우는 별도의 처리가 필요하다.)
우선 숫자와 문자를 저장할 자료구조를 생각해야 하는데,
첫 번째로 숫자를 key로 문자열을 value로 하기 위해선 배열을 사용하면 된다.
두 번째로 string을 숫자로 매핑하는 것은 배열보다는 Map 자료구조를 사용하는 것이 더욱 빠르다
.
#include <bits/stdc++.h>
using namespace std;
int n,m;
string names[100004];
map<string, int> numbers;
string name;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> name;
names[i] = name;
numbers[name] = i;
}
string problem;
for (int i = 0; i < m; i++) {
cin >> problem;
if (atoi(problem.c_str()) == 0) {
cout << numbers[problem] << '\n';
}else{
cout << names[atoi(problem.c_str())] << '\n';
}
}
return 0;
}
근데 시간초과다. 그래서 다음과 같은 코드를 찾았다.
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false)은 C++의 표준 입출력(std::cin 및 std::cout)과 C의 입출력(scanf 및 printf)의 동기화를 해제하는 역할을 합니다. 동기화 기능을 해제함으로써 입출력 속도를 향상할 수 있습니다.
기본적으로 C++의 std::cin과 C의 scanf는 서로 버퍼를 공유하며, 동기화되어 작동합니다. 이는 입출력 작업이 서로 번갈아가며 일어나므로 조금 더 느릴 수 있습니다. 그러나 동기화를 해제함으로써, std::cin과 scanf를 독립적으로 사용할 수 있습니다.
cin.tie(NULL)은 std::cin과 std::cout을 묶어주는 연결을 해제하는 역할을 합니다. 즉, std::cin과 std::cout 사이의 연결을 제거하여 입출력 작업이 병목되는 것을 방지합니다.
cout.tie(NULL)은 std::cout과 std::cerr을 묶어주는 연결을 해제하는 역할을 합니다. 이는 std::cout의 출력 작업이 std::cerr의 출력 작업에 영향을 주지 않도록 합니다.
위의 세 가지 코드는 일반적으로 입출력 속도를 높이기 위해 사용됩니다. 하지만 동시에 std::cin과 std::cout을 동시에 사용하는 경우 예기치 않은 동작이 발생할 수 있으므로 주의해야 합니다.
추가로, ios_base::sync_with_stdio(false)를 사용하면 C 스타일의 입출력 함수(printf, scanf)와 C++의 std::cin, std::cout을 혼용하는 것이 좋지 않습니다. 동기화가 해제되어 일관성 없는 결과가 발생할 수 있습니다. 따라서 C++에서는 입출력에 대해서는 std::cin과 std::cout을 사용하는 것이 권장됩니다.
#include <bits/stdc++.h>
using namespace std;
int n,m;
string names[100004];
map<string, int> numbers;
string name, problem;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> name;
names[i] = name;
numbers[name] = i;
}
for (int i = 0; i < m; i++) {
cin >> problem;
if (atoi(problem.c_str()) == 0) {
cout << numbers[problem] << '\n';
}else{
cout << names[atoi(problem.c_str())] << '\n';
}
}
return 0;
}
'자료구조와 알고리즘 > 알고리즘' 카테고리의 다른 글
1213 (0) | 2023.07.09 |
---|---|
9375 (0) | 2023.07.08 |
2559 (0) | 2023.07.06 |
9996 (0) | 2023.07.04 |
ROT13(11655) (0) | 2023.07.02 |
댓글