03.스킬트리
-
문제이해
문제 이름으로 봐서는 트리구조와 관련된 문제같지만 아니였다. 문자열(스킬트리)들 중에서 원하는 조건(문자 순서)를 반드시 만족하는 문자열의 개수를 구하는 문제이다. -
pseudo code
문자열에 하나씩 접근한다.
접근한 문자열에서 문자를 하나씩 조건과 대조를 한다.
모든 조건을 만족했을 경우 count의 수를 증가시켜준다. -
문제점
처음 문제를 봤을 때 3중 loop를 통해서 문제를 해결하면 되겠다고 생각했다. 그러나 조건에서 문자열의 앞뒤 순서와 꼭 모든 문자열이 있지 않아도 된다는 조건을 적용시키는데 막혔다. 나중에 보니 반복문을 통해서도 문제 해결은 가능했다. 그러나 효율적이고 새로운 방식을 통해 문제를 풀어보고자 map을 공부하고 적용시켜보기로 했다. -
map
map헤더파일에 존재
선언은 map<'type1','type2'> 변수명
type1: key, type2: value로 키와 값으로 구성
Key의 중복을 허용하지 않는 것이 특징!(중복을 허용하는 multi_map이 존재)
또한, key값으로 자동으로 정렬해준다. (default는 오름차순)
내림차순은 map<int, string, greater< int >>
문자열이 key값일 경우 첫글자를 기준으로 정렬해준다.- 저장 형태
- 저장 형태
-
map 적용 코드
#include <map>
#include <iostream>
#include <string>
using namespace std;
int main() {
map<int, string> m1;
map<char, int> m2;
map<string, int>m3;
//m1 생성법
//map의 속성
//키가 되는 값의 중복을 허용하지 않는다. 중복을 허용하는 map을 만들려면 multi_map이라고 따로 있다.
//map.insert(pait<type,type>)를 통해 입력한다.
//만약 중복되는 키값의 입력이 있다면 먼저 있던 값이 유지 된다.
//또한 키값에 자동 정렬된다.
m1.insert(pair<int, string>(40, "me"));
m1.insert(pair<int, string>(35, "show"));
m1.insert(pair<int, string>(10, "Dok2"));
m1.insert(pair<int, string>(20, "lee"));
m1.insert(pair<int, string>(10, "kim"));
//반복문을 통해 접근하여 값을 수정할 수 있다.
for (int i = 0; i < 3; i++) {
m1[i] = "auto";
}
//접근 방법
//iterator를 통해 접근하기
map<int, string> ::iterator iter;
for (iter = m1.begin(); iter != m1.end(); iter++) {
cout << "[" << iter->first << "," << iter->second << "]" << " ";
}
cout << endl;
//문자열이 키값일 경우 첫글자를 기준으로 정렬한다.
m3.insert(pair<string, int>("lee", 1));
m3.insert(pair<string, int>("kim", 2));
m3.insert(pair<string, int>("park", 3));
m3.insert(pair<string, int>("hwang", 4));
map<string, int> ::iterator iter1;
for (iter1 = m3.begin(); iter1 != m3.end(); iter1++) {
cout << "[" << iter1->first << "," << iter1->second << "]" << endl;
}
return 0;
}
> 참고:https://hwan-shell.tistory.com/149
- 문제 풀이
#include
#include
#include
using namespace std;
int solution(string skill, vector skill_trees) {
int answer = 0;
map<char,int>skillTree;
//맵생성
for(int i = 0 ; i<skill.size();i++){
skillTree[skill[i]] = i+1;
}
for(int i = 0 ; i<skill_trees.size();i++){
int count = 1;
bool check = true;
for(int j = 0 ; j<skill_trees[i].size();j++){
if(skillTree[skill_trees[i][j]]>count){
check = false;
break;
}
else if(skillTree[skill_trees[i][j]]==count){
count++;
}
}
if(check)
answer++;
}
return answer;
}
- 정리
map에 대해서 공부하고 사용해보았다. 꽤나 고민했던 부분이 수월하게 해결할 수 있었다.
특히나 값을 만족하는 인덱스가 필요할 때 잘 활용할 수 있는 것 같다.
또한 iterator를 통해 반복문으로 원소에 쉽게 접근할 수 있으니 잘 사용하자!!
Author And Source
이 문제에 관하여(03.스킬트리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@honeyoung_0117/03.스킬트리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)