[C++] 1620 나는야 포켓몬 마스터 이다솜

cherry_·2023년 10월 12일
0

코딩테스트 준비

목록 보기
5/15

나는야 포켓몬 마스터 이다솜

정답

#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

int main()
{
	// 입출력 속도 향상
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
    int n, m;   //포켓몬 개수, 문제 개수
    map<string, int> smap;
    map<int, string> imap;
    cin >> n >> m;
    
    for(int i=1; i<=n; i++){
        string name;
        cin >> name;
        
        smap[name] = i;
        imap[i] = name;
    }
    
    for(int i=0; i<m; i++){
        string t;
        cin >> t;
        if(isdigit(t[0]) != 0){    //number
            cout << imap[stoi(t)] << "\n";
        }
        else{   //string
            cout << smap[t] << "\n";
        }
    }

    return 0;
}
  • map 2개를 이용
  • isdigit()로 숫자인지 문자인지 파악

생각의 흐름

번호와 이름을 매칭해서 저장하면 될 거 같다.
map 과 딕셔너리가 떠오르는데 둘의 차이점이 뭐지? (아래 정리함)

맵을 써도 될 듯!

..근데 입력값이 숫자인지 string인지 어떻게 알지?
int로 받거나 auto로 받아서 해보려 했지만 실패.

아! 번호 자체도 string으로 하면 어떨까? map<string, string> m 이렇게!

첫 번째 시도 -> 컴파일 에러

#include <iostream>
#include <algorithm>
#include <map>

using namespace std;

//map -> key : value
//딕셔너리랑 차이점이 뭐지?

int main()
{
    int n, m;   //포켓몬 개수, 문제 개수
    map<string, string> map;
    cin >> n >> m;
    
    for(int i=1; i<=n; i++){
        string name;
        cin >> name;
        map[to_string(i)] = name;        //insert to map
    }
    
    for (int i=0; i<m; i++){
        string t;
        cin >> t;
        
        for(auto j=map.begin(); j!=map.end(); j++){
            if(map.find(t) == j-> first){
                cout << j->second;  
                continue;
            }    
        }
        for(auto j=map.begin(); j!=map.end(); j++){
            if(t == j->second){
                cout << j->first;  
                continue;
            }    
        }
    }

    return 0;
}

ㅋㅋ... map 조회하는 법 몰라서 삽질했다. 나의 멍청함에 cheers...~⭐

기억할 것

  1. vs 딕셔너리
  • 둘의 차이점이 뭐지?

    맵에서는 엔트리들이 유일한 키를 가져야 하는 반면, 딕셔너리에서는 여러 엔트리들이 같은 키를 가질 수 있다. 갖은 단어가 복수의 정의를 가질 수 있는 영어 사전과 같다고 볼 수 있다.

  • 파이썬의 딕셔너리는 hash 구조이지만, c++의 맵은 트리 구조이다.
  1. 사용법
    • 중복된 key를 사용하여 입력하면 덮어씌어짐.
    • 추가, 삽입, 삭제 시 자동정렬
  • 선언 : map<key 자료형, value 자료형> m;
  • 추가 : map[키] = 값;
  • 삭제 : m.erase(key);
  • 조회 : m[키];
  • 검색 : m.find(key);
    - iter = m.find(key); iter -> second; 이런 식으로 출력 가능
  1. isdigit(char x)
    문자가 숫자인지 판별하는 함수 (문자라면 0 반환)
    반드시 char을 넣어야 한다! string 넣으면 안 됨!

참고

[c언어/c++] isdigit 함수(숫자를 판별하는 함수)

0개의 댓글