프로그래밍/프로그래머스

Lv1_[성격유형 검사하기, C++] 알고리즘 정리 - 프로그래머스

워킹독 2022. 11. 10. 09:41
728x90

문제 내용, 조건, 예시는 프로그래머스 사이트 참조


 

문제와 풀이는 길고 복잡하게 보이지만 간단하게 생각하면 쉽게 풀리는 문제

각 지표별 2개의 유형, 0~3까지의 점수를 구해서 알맞은 문자를 리턴 시켜주면 된다.

 

예를 들어 survey : RT를 정리해보면

위와 같은 형태로 정리가 가능하다.

 

여기서 choice의 값으로 원하는 index와 점수를 구할 수가 있는데
· score : (choice - 4)의 절대값
· index : (choice / 4)의 정수값
로 계산이 가능하다.

ex) survey가 RT이고 choice값이 5인 경우
· score : abs(5 - 4) = 1
· index : (5 / 4) = 1
T[1]에 score는 1점을 얻을 수 있다. (T에 1점 저장)

ex) survey가 RT이고 choice값이 1인 경우
· score : abs(1 - 4) = 3
· index : (1 / 4) = 0
R[0]에 score는 3점을 얻을 수 있다 (R에 3점 저장)

 

구한 값을 저장 방식은 vector<int>에 값을 저장해 주면 된다.

각 인덱스는 알파벳으로 매칭을 해주고 기억해주면 된다.

(R:0, T:1, C:2, F:3, J:4, M:5, A:6, N:7)

지표별로 두 개씩 묶어주고 동일한 점수면 "단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단"의 조건이 있기 때문에 알파벳이 빠른 것을 앞으로 배치해주었다.

 

 

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
#include <string>
#include <vector>
 
int getIndex(char c) {
    int value;
    switch(c) {
        case 'R': { value = 0; } break;
        case 'T': { value = 1; } break;
        case 'C': { value = 2; } break;
        case 'F': { value = 3; } break;
        case 'J': { value = 4; } break;
        case 'M': { value = 5; } break;
        case 'A': { value = 6; } break;
        case 'N': { value = 7; } break;
        default: { value = -1; } break;
    }
    return value;
}
 
int getChar(int i) {
    char value;
    switch(i) {
        case 0: { value = 'R'; } break;
        case 1: { value = 'T'; } break;
        case 2: { value = 'C'; } break;
        case 3: { value = 'F'; } break;
        case 4: { value = 'J'; } break;
        case 5: { value = 'M'; } break;
        case 6: { value = 'A'; } break;
        case 7: { value = 'N'; } break;
        default: { value = -1; } break;
    }
    return value;
}
 
string solution(vector<string> survey, vector<int> choices) {
    string answer = "";
    vector<int> saveScore;
    saveScore.resize(80); // size 8, 0으로 초기화
 
    // 성격 유형과 choice 값으로 점수 저장
    for(unsigned int i = 0; i < survey.size(); i++) {
        int choices_num = choices[i];
        int score = abs(choices_num - 4);
        if(score != 0) {
            char c = survey[i][choices_num / 4];
            int index = getIndex(c);
            if(index != -1) {
                saveScore[index] += score;
            }
        }
    }
    
    // 점수 계산이 끝내고 문자로 변환
    for(unsigned int i = 0; i < saveScore.size(); i+=2) {
        if(saveScore[i] < saveScore[i+1]) {
            answer += getChar(i+1);
        } else {    // saveScore[0] >= saveScore[1]
            answer += getChar(i);
        }
    }
 
    return answer;
}
cs

 

↓↓↓↓↓↓ 유익했다면 하트 뿅 ♥ ↓↓↓↓↓↓

728x90
반응형