본문 바로가기
자료구조와 알고리즘/알고리즘

1620

by oncerun 2023. 7. 6.
반응형

 

문제 요약

 

포켓몬 마스터가 되기 위한 도감 완성.

 

 

입력

 

도감에 기록된 포켓몬의 개수 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

댓글