이것저것 공부한 기록

C++) HackerRank 풀이_Hash Tables : Ransom Note 본문

Study/프로그래밍 문제풀이

C++) HackerRank 풀이_Hash Tables : Ransom Note

블랜디 2019. 10. 25. 18:34

https://www.hackerrank.com/challenges/ctci-ransom-note/problem?h_l=interview&playlist_slugs%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D=dictionaries-hashmaps

 

Hash Tables: Ransom Note | HackerRank

Given two sets of dictionaries, tell if one of them is a subset of the other.

www.hackerrank.com

 

Hash / Map stl에 대해서 공부하기 위해 집어든 문제

 

갯수까지 파악해야한다는 조건을 첨에 못 봐서 문자열을 하나하나 비교하고 있었는데,

 

6 5

two times three is not four

two times two is four

위 Input에서 오답에 걸려서 자세히 보니 밑에는 two가 두 번 나오기때문에 안된다는거다

그렇지그렇지

 

그래서 count 배열이라도 만들어놓고 하나하나 빼줘야하나 했는데

 

친구가 보더니 바로 이때 map을 사용해야 한다고 하더라

 

 

그...그러게?

 

그래서 첨으로 공부해봤는데... map 이거 신세계임 ;

Key-Value 조합으로 저장할 수 있음. value가 필요없다면 set으로 저장해버려도 됨.

그러나결국 Key로 Value를 찾아서 쓸 일이 많으므로 map을 공부하도록 합시다.

 

Magazine array의 각 단어들을 key로 하는 맵을 만든다.

Value는 각 단어들이 Magazine array에서 출현하는 빈도수로

 

그래서 note의 각 단어들을 넣어서 해당 Key에 해당하는 값이 저장되어 있는지,

저장되어 있다면 value가 1인지 (쓸 수 있는지) 계산해서

쓸 수 있는 경우 value에서 --하고 종료

 

뭐 이런 식으로 짜면 됩니다.

 

(전체코드는 더러워서 함수만)

 

void checkMagazine(vector<string> magazine, vector<string> note) {
	map<string, int> words_map;

	int lenMagazine = magazine.size();
	int lenNote = note.size();

	for (int i = 0; i < lenMagazine; ++i)
	{
    	//insert 방법이 3개인데 맨 밑에 있는게 현재 쓰기 좋음
		//words_map.insert(pair < string, int>(magazine[i], 1));
		//words_map.insert(make_pair(magazine[i], 1));
		words_map[magazine[i]] += 1;
	}

	for (int i = 0; i < lenNote; ++i)
	{
		if (words_map.end() != words_map.find(note[i]))
		{
			if (words_map[note[i]] == 0)
			{
				cout << "No" << endl;
				return;
			}
			else
			{
				words_map[note[i]] -= 1 ;
			}
		}
		else
		{
			cout << "No" << endl ;
			return;
		}
	}

	cout << "Yes" << endl;
	return ;
}