boj 1620번 문제를 통해 생각해본 내 풀이와 개선 방안에 대하여.

처음에 boj 1620번 문제를 접한후, 미완성이지만 내가 작성한 문제 해결 방안에 대한 코드를 첨부해보면, 

#include <bits/stdc++.h>
using namespace std;

int n, m;

unordered_map<string,int> name;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin>>n>>m;
    int cnt=1;
    while(n--){
        string s;
        cin>>s;
        name[s]=cnt;
        cnt++;
    }
    while(m--){
        string tmpS;
        int tmpI;
        

    }
}

이런식의 결을 가진 코드를 작성했었다. 그런데 이런 코드 방향을 생각하게 된 이유는, 

결국 키-값 밸류쌍을 받아들여서 unordered_map에 담고난 뒤, m가지의 입력으로 받아들인 스트링 혹은 인트 값을 통해서

각각에 연결되어있는 인트 값 혹은 스트링 값을 찾아야 하는데, 그때에 밸류값을 입력받으면 그에 맞는 키 값을 찾아보자 라는 식으로 생각해서 코드의 방향성이 이렇게 가게 된 것이다. 이때에 그렇다면 unordered_map의 경우 밸류값을 통해서 키 값을 찾을 수 있는지를 먼저 알고 나아갔어야 하는 코드 작성 방안이었었는데, 그런식의 생각을 하지 못하고 먼저 코드를 작성해 나갔던 것이 개선해야 할 점이라는 생각이 든다. 

이와 관련하여서 한번 검색해보았다. 

ㅇㄴㄹ

 

"반대로 값(value)을 통해 키를 찾는 것은 직접적으로 지원하지 않습니다. unordered_map은 키를 중심으로 구성되어 있으며, 키를 통해 값을 찾는 것이 주요 용도입니다. 값(value)을 기준으로 검색하려면 추가적인 작업이 필요합니다. 예를 들어, unordered_map을 순회하면서 값을 비교하여 해당 값을 가진 키를 찾을 수 있습니다."

 

이 부분을 통해서 그렇게 밸류를 통해서 키 값을 찾는것을 지원하는건 직접적으로 지원하지 않는다는 정보를 얻을 수 있었다. 

그리고 값을 이용해 찾을 수 있는 방법이 있는데, 그건 unordered_map에 있는 각 요소별로 모두 순회 하면서 밸류값을 찾은뒤, 그 밸류에 pair로 엮여있는 pair.first에 해당하는 key 값을 찾는 방법을 알 수 있었다. 

그런데 이런 방법을 사용하여서  만약 1620번 문제에 사용하려 한다면, 결국 m개의 경우로 주어지는 케이스들이 모두 숫자인 경우, 

각각의 밸류값을 모두 unordered_map 내부에서 순회하면서 찾아야 하는데, unordered_map은 이름에서 알 수 있듯이, 

unordered 이기 때문에 어디있는지 몰라서 저렇게 찾는 방법에서 시간복잡도를 줄이는 개선 방안도 현재는 생각나지 않는다. 

굉장히 시간이 오래 걸리는 과정이 되지 않을까 싶다.

 

그러니 unordered_map을 사용하는 경우, 밸류 값을 통해서 키 값을 찾아야 할때, 위에서 제시해준 방법처럼 순회하면서 pair를 찾고 그걸 이용해서 pair.first에 해당하는 key값을 찾기보다는, 다른 방법을 이용하는 풀이를 먼저 떠올려 보도록 하자. 

예를들어 참고용 코드의 경우는 애초부터 받을때 전부 배열에 저장해서 나중에 밸류값을 통한 키 값을 찾을때 우선적으로 배열에서 찾고, 

그리고 키 값을 통한 밸류값을 찾을때는 처음 배열에 받은 값들을 unordered_map에 담아놓은 컨테이너를 이용해서 거기서 찾는다. 

이런식의 방법을 배워두고 다음에 이런 유형의 문제를 만나면 그 방향성으로 먼저 생각해서 풀어보도록 하자. 

 

  Comments,     Trackbacks