알고리즘

프로그래머스 : : 스킬트리 - C++ 풀이

green333 2021. 12. 30. 20:31
728x90
SMALL

https://programmers.co.kr/learn/courses/30/lessons/49993?language=cpp 

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

 

 

 
 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <string>
#include <vector>
 
//        0  1  2  3  4  불가능
//CBD <-> B  A  C  D  E 
//        1   
//------------------------
//        0  1  2  3  4  가능 
//CBD <-> C  B  A  D  F
//        0  1  1  2  2
//------------------------
//        0  1  2  3     가능 
//CBD <-> A  E  C  B
//        -1 -1 0  1
//------------------------
//        0  1  2        불가능 
//CBD <-> B  D  A
//        1    
//------------------------
//        0  1  2  3  4  불가능 
//CBD <-> B  A  C  D  E
//        1
//------------------------
//        0  1  2        불가능 
//CBD <-> A  A  B
//        -1 -1 1 
//------------------------
//        0  1  2  3  4  불가능 
//CBD <-> C  A  A  A  D
//        0  0  0  0  2
 
using namespace std;
 
int solution(string skill, vector<string> skill_trees) {
    int answer = 0;
    int idx;
    bool flag;
    int check;
    int tmp;
    
    for(int i = 0; i < skill_trees.size(); i++){
        flag = true;
        idx = -1;
        check = -1;
  
        for(int j = 0; j < skill_trees[i].size(); j++){
            
            if(check == -1 && skill.find(skill_trees[i][j]) != 0 && skill.find(skill_trees[i][j]) != string::npos) { 
                flag = false;
                break;
            }
            
            check = 1;
               
            if(skill.find(skill_trees[i][j]) == string::npos){
                continue;
            }
            
            tmp = skill.find(skill_trees[i][j]);
 
            if( (tmp-idx) > 1){
                flag = false;
                break
            }
            idx = skill.find(skill_trees[i][j]);
        }
        
        if(flag == true){
            answer++;
        }
    }   
    return answer;
}
cs

 

부끄럽지만...  코딩 경험이 부족해서 그런지 너무 헤맸던 문제,,,ㅠ ㅠ 이제 시작이니깐 앞으로 연습하다보면 더 좋은 코드가 나오겠지!

 

알아야할 것 !

- String.find(string) 함수의 리턴 값을 알아야함

1
2
3
4
5
6
7
8
9
10
ex)
 
int result; 
string text = "abcde";
 
result = text.find("a"// result = 0
result = text.find("b"// result = 1
result = text.find("c"// result = 2
result = text.find("z"// result = 19200000 (더미 값)
 
cs

 

- skill.find(skill_trees[i][j]) : skill_trees[i][j]이 skill에 없다면, -1을 반환하는 것이 아닌 엄청 큰 더미값이 반환된다. 

   그래서 값이 없을때는 skill.find(skill_trees[i][j]) != string::npos 이런식으로 처리해줘야함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        for(int j = 0; j < skill_trees[i].size(); j++){
            
            if(check == -1 && skill.find(skill_trees[i][j]) != 0 && skill.find(skill_trees[i][j]) != string::npos) { 
            // 해당 if문은 각 vector값의 첫번째 char가 CBD중 C가 아닐때 바로 answer에서 제외하는 코드
                flag = false;
                break;
            }
            
            check = 1//vector 값의 첫번째 char를 비교할때가 아니면 모두 check는 1로 설정 (첫번째 char 비교할때만 check = -1)
               
            if(skill.find(skill_trees[i][j]) == string::npos){ //char를 하나씩 비교할때, CBD가 아니면 continue
                continue;
            }
            
            tmp = skill.find(skill_trees[i][j]); // tmp는 현재 skill.find(skill_trees[i][j])값 , idx는 이전 skill.find(skill_trees[i][j]) 값
            if( (tmp-idx) > 1){  // 이전 값과 현재 값의 차이가 1을 넘어서면 answer에서 제외 
                flag = false;
                break
            }
            idx = skill.find(skill_trees[i][j]); //idx값 업데이트
        }
        
 
cs

 

 

 

LIST