<프로그래머스 C++> 성격 유형 검사하기 풀이

2026. 5. 26. 09:49Programmers

문제

4개의 지표로 성격 유형을 구분하는 검사지를 구현하는 검사지를 구현하는 문제이다.

 

각 질문마다 비동의 / 동의 관련 성격 유형이 정해져 있고, 선택지(1 ~ 7)에 따라 점수가 부여된다. 모든 질문의 점수를 합산해 각 지표에서 높은 점수의 유형을 반환한다. 동점이면 사전순으로 빠른 유형을 선택한다.

survey choices result
["AN", "CF", "MJ", "RT", "NA"] [5, 3, 2, 7, 5] "TCMA"
["TR", "RT", "TR"] [7, 1, 3] "RCJA"

문제 흐름 파악

1. 점수 지정 방식

8가지 성격 유형 { R, T, C, F, J, M, A, N } 각각의 점수를 저장해야 한다.

알파벳을 키로, 점수를 값으로 저장하는 map<char, int>를 사용했다.

 

2. 점수 계산 방식

choices는 1~7이고, 4가 기준점이다.

  • choices < 4 → 비동의 관련 → survey[i][0]에 점수 추가
  • choices == 4 → 모르겠음 → 0점
  • choices > 4 → 동의 관련 → survey[i][1]에 점수 추가

점수의 크기는 4와의 차이로 계산한다.

abs(choices[i] - 4)

 

3. 지표별 비교

4개의 지표를 순서대로 비교해 더 높은 점수의 유형을 answer에 추가한다.

동점이면 사전순으로 빠른 유형을 선택한다.


문제 풀이

#include <string>
#include <vector>
#include <map>
using namespace std;

string solution(vector<string> survey, vector<int> choices) {
    string answer = "";
    map<char, int> mbti;

    for(int i = 0; i < survey.size(); ++i)
    {
        int s = abs(choices[i] - 4);
        if(choices[i] < 4)
            mbti[survey[i][0]] += s;
        else if(choices[i] > 4)
            mbti[survey[i][1]] += s;
    }

    vector<pair<char,char>> types = {{'R','T'}, {'C','F'}, {'J','M'}, {'A','N'}};
    for(auto& p : types)
    {
        if(mbti[p.first] >= mbti[p.second])
            answer += p.first;
        else
            answer += p.second;
    }

    return answer;
}

코드 흐름

1. 점수 계산

int s = abs(choices[i] - 4);
if(choices[i] < 4)
    mbti[survey[i][0]] += s;
else if(choices[i] > 4)
    mbti[survey[i][1]] += s;

 

abs(choices[i] - 4)로 점수 크기를 계산한다. 비동의면 survey[i][0], 동의면 survey[i][1] 유형에 점수를 누적한다.

 

choices==4면 아무것도 추가하지 않는다.

 

2. 지표별 비교

vector<pair<char,char>> types = {{'R','T'}, {'C','F'}, {'J','M'}, {'A','N'}};
for(auto& p : types)
{
    if(mbti[p.first] >= mbti[p.second])
        answer += p.first;
    else
        answer += p.second;
}

4개 지표를 순서대로 순회한다.

p.first >= p.second면 p.first를 추가하는데, >=로 동점 처리도 한 번에 해결된다.

이미 사전순 정렬이 되어있기 때문이다.


핵심 포인트

  • map<char, int>로 8가지 성격 유형의 점수를 관리한다
  • 점수 크기는 abs(choices[i] - 4)로 계산한다