ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] Programmers: 성격 유형 검사하기
    프로그래밍/알고리즘 PS 2024. 4. 1. 21:03

    학교에서 진행하는 수업에서 공유받은 알고리즘 문제를 풀어보았다. 문제의 난이도는 프로그래머스 레벨 1으로, 난이도를 보았을 때 간단히 풀 수 있는 문제로 예상하였으나 문제의 길이가 길어 읽고 이해하는 데에만 오랜 시간이 걸렸고, 시간을 들여 문제를 풀어냈다.

    문제 링크

    https://school.programmers.co.kr/learn/courses/30/lessons/118666

    문제 분석

    문제를 구체적으로 분석하기 앞서 간단히 설명하면, 카카오 방식의 MBTI 검사를 만든 문제라고 할 수 있다. 각 검사지 "RT", "CF", "JM", "AN" 유형 중에서 높은 점수가 나온 쪽이 검사 결과로 나타나는 방식이다. 예를 들면 누군가는 검사 결과 "RCJN"이 나올 수 있다.

    문제 풀이

    문제를 풀 때에는 map 자료 구조를 활용하여 문제를 풀어내었다.

    먼저 map 자료구조의 인스턴스 m을 생성하고 "RTCFJMAN"에 해당되는 key에 대한 값을 모두 0으로 초기화하였다. 그리고 사용자가 선택한 값 choices에 따라 점수를 계산하여 m에서 key에 해당하는 점수를 높여주었다.

    마지막에 if문을 통해 "RTCFJMAN" 중 어떤 key가 더 높은 점수를 받았는지 비교하여 answer를 정해주었다.

    전체 코드

    #include <string>
    #include <vector>
    #include <map>
    
    using namespace std;
    
    string solution(vector<string> survey, vector<int> choices)
    {
        string answer = "";
    
        map<string, int> m;
    
        m.insert({"R", 0});
        m.insert({"T", 0});
        m.insert({"C", 0});
        m.insert({"F", 0});
        m.insert({"J", 0});
        m.insert({"M", 0});
        m.insert({"A", 0});
        m.insert({"N", 0});
    
        int size = survey.size();
    
        for (int i = 0; i < size; i++)
        {
            int score = 0;
            string target = "";
            switch (choices[i])
            {
            case 1:
            case 2:
            case 3:
                score = 4 - choices[i];
                target = survey[i][0];
                break;
            case 5:
            case 6:
            case 7:
                score = choices[i] - 4;
                target = survey[i][1];
                break;
            }
            auto map_it = m.find(target);
            m[target] = score + (map_it->second);
        }
    
        if (m.find("R")->second >= m.find("T")->second)
            answer += "R";
        else
            answer += "T";
    
        if (m.find("C")->second >= m.find("F")->second)
            answer += "C";
        else
            answer += "F";
    
        if (m.find("J")->second >= m.find("M")->second)
            answer += "J";
        else
            answer += "M";
    
        if (m.find("A")->second >= m.find("N")->second)
            answer += "A";
        else
            answer += "N";
    
        return answer;
    }
Designed by Tistory.