문제 : 성격 유형 검사하기
간단 요약
설문 조사에 따라 영향 받는 성격 유형과, 응답 결과를 받았을 때, 성격 유형을 출력해보자
규칙
- 만약 점수가 같을 경우 사전 순으로 빠른 것으로
데이터
n survey choices 의미 Survey의 크기 각 설문 조사별 영향 받는 성격 유형이 들어간 리스트 설문 조사에 대한 응답 종류 범위 1 ~ 1,000 [[“A”, “N”],[“C”, “F”],[“M”, “J”],[“R”, “T”],[“N”, “A”]] 1 ~ 7 (매우 비동의 ~ 매우 동의) 해결책
문자를 정수형으로 변환하기
만약 ‘A’에 대한 점수를 저장하고 싶을 때는 어떻게 해야 할까?
배열의 경우 인덱스를 정수로 가지기 때문에, 문자를 인덱스로 삼는 건 불가능하다.
Map을 쓸 수도 있지만, 알파벳의 경우 대소문자 많아봐야 60개를 안넘는 작은 숫자이기 때문에,
매 연산마다 \(\begin{aligned} logN \end{aligned}\) 의 시간이 걸리는 작업을 하기는 조금 아쉽다.결론적으로 맨 앞의 알파벳을 0으로 하는 인덱스로 변환하는 것이다.
이것에 대해서는 ASCII를 알아야 한다.
다만 깊게 알 필요는 없으며, 간단하게 말하자면 문자도 정수로 표현이 된다 정도만 알아도 PS에는 문제 없다.
ASCII란 American Standard Code for Information Interchange로,
정보 교환용 7bit 부호 체계이다.
1Byte는 8bit이지만, 1bit를 Parity Bit라는 신호 변질 등 오류 검출을 위한 Bit로 사용한다.결론적으로
a~z,A~Z모두 정수형으로 표현이 가능하고, 이를 배열의 인덱스로 이용할 것이다.예를 들어 ‘A’에 대한 정수형의 정보를 저장하고 싶을 때는
// file: "ASCIITechnique.cpp" // 문자를 정수의 인덱스로 변환하기 #include <iostream> using namespace std; int main(){ int charData[60]; // 영어로 문자가 들어온다고 할 때, 받기 위한 변수 char x; int data; cin >> x >> data; // a문자의 아스키 코드가 k라고 할 때, b는 k+1, c는 k+2 등 순차적으로 늘어난다. // 이를 이용해서 'a'의 아스키 코드 값과의 차이를 이용해서 정수로 변환한다. // 본 코드로는 a문자가 0번 인덱스가 되는 것을 기준으로 b는 1, c는 2가 된다. charData[x - 'a'] = data; }접근법
위의 테크닉을 이용하여 대문자의 문자를 정수로 변환하여 각 성격 유형별 점수를 저장할 것이다.
score 배열을 선언하여 각 응답 유형별 점수를 통해 설문 조사 문항 개수 만큼 돌아가면서 점수를 계산한다.
전체 코드
// file: "solution.cpp" #include <string> #include <vector> using namespace std; // 점수 배점을 위한 score 배열 int score[8] = {0,3,2,1,0,1,2,3}; // 성격 유형별 점수를 저장하기 위한 배열 int persona[30]; string solution(vector<string> survey, vector<int> choices) { // 설문 사이즈만큼 돌아가면서 for(int i = 0; i < survey.size(); i++){ // 만약 약간 동의 이상의 긍정이라면 if(choices[i] >= 5){ // 문자 - 'A'를 통해 문자를 정수형의 값으로 변경한다. // 'A'가 0이 되는 것을 시작으로 증가 // 긍정을 택했을 때 추가되는 알파벳의 점수를 응답한 정도에 따라 추가 persona[survey[i][1] - 'A'] += score[choices[i]]; }else if(choices[i] <= 3){ // 부정을 택했을 때 추가되는 알파벳의 점수를 응답한 정도에 따라 추가 persona[survey[i][0] - 'A'] += score[choices[i]]; } } string answer = ""; // 대척점이 되는 각 성격 유형의 점수를 비교해서 사전 순으로 앞서는 것이 같거나 크다면 그것으로 // 아니면 다른 것으로 성격 유형을 결정하기 if( persona['R' - 'A'] >= persona['T'-'A'] ) answer += 'R'; else answer += 'T'; if( persona['C' - 'A'] >= persona['F'-'A'] ) answer += 'C'; else answer += 'F'; if( persona['J' - 'A'] >= persona['M'-'A'] ) answer += 'J'; else answer += 'M'; if( persona['A' - 'A'] >= persona['N'-'A'] ) answer += 'A'; else answer += 'N'; return answer; }