[프로그래머스] 2022 KAKAO TECH INTERNSHIP - 성격 유형 검사하기 (JAVA)

·2023년 1월 16일
0

프로그래머스

목록 보기
18/59

📌 문제 설명

나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.

지표 번호성격 유형
1번 지표라이언형(R), 튜브형(T)
2번 지표콘형(C), 프로도형(F)
3번 지표제이지형(J), 무지형(M)
4번 지표어피치형(A), 네오형(N)

4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.
검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.

  • 매우 비동의
  • 비동의
  • 약간 비동의
  • 모르겠음
  • 약간 동의
  • 동의
  • 매우 동의
  • 매우 동의매우 비동의 선택지를 선택하면 3점을 얻습니다.
  • 동의비동의 선택지를 선택하면 2점을 얻습니다.
  • 약간 동의약간 비동의 선택지를 선택하면 1점을 얻습니다.
  • 모르겠음 선택지를 선택하면 점수를 얻지 않습니다.

검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.
질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개 변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해 주세요.

📌 제한 사항

  • 1 ≤ survey의 길이 ( = n) ≤ 1,000
    • survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
    • survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
    • survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
  • choices의 길이 = survey의 길이
    • choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
    • 1 ≤ choices의 원소 ≤ 7
choices
1매우 비동의
2비동의
3약간 비동의
4모르겠음
5약간 동의
6동의
7매우 동의

📌 입출력 예

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

📌 코드

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        String []type = {"R","T","C","F","J","M","A","N"};
        int []count = new int[8];
        for(int i = 0; i < choices.length; i++){
            if(choices[i] >= 5){
                for(int j = 0; j < type.length; j++){
                    if(survey[i].substring(1).equals(type[j]))
                        count[j] += (choices[i] - 4);
                }
            }
            if(choices[i] <= 3){
                for(int j = 0; j < type.length; j++){
                    if(survey[i].substring(0,1).equals(type[j]))
                        count[j] += (4 - choices[i]);
                }
            }
        }
        for(int i = 0; i < type.length; i+=2){
            if(count[i] < count[i + 1])
                answer = answer.concat(type[i + 1]);
            else if(count[i] > count[i+1])
                answer = answer.concat(type[i]);
            else {
                if(type[i].compareTo(type[i + 1]) < 0)
                    answer = answer.concat(type[i]);
                else answer = answer.concat(type[i + 1]);
            }
        }
       return answer;
    }
}

📌 문제 해결 과정

💡 먼저 성격 유형들을 type이라는 String 배열에 넣어 두었고, count 배열은 각 type의 점수를 저장하기 위한 int형 배열이다

💡 반복문을 돌리며 choices[i] (고른 선택지)가 5 이상이라면 survey 배열의 원소의 두 번째 글자를 잘라내 해당 알파벳에 선택지만큼의 점수를 더해 주며 반대로 choices[i]가 3 이하라면 survey 배열 각각의 원소의 첫 번째 알파벳을 잘라내 해당 알파벳에 선택지만큼의 점수를 더해 주게 된다

💡 점수 계산을 다 한 후에 지표끼리 점수를 비교해 주게 된다 1, 2, 3 4 각각의 지표에서 점수가 더 큰 것을 선택하게 되고 만약 점수가 같을 때는 compareTo() 사용하는데, 음수가 나오면 비교한 다른 알파벳보다 사전 순으로 먼저 나온다는 의미로 그 알파벳을 선택하고, 양수가 나오면 비교한 다른 알파벳을 선택하게 된다

💡 지표끼리 비교하는 반복문은 한 지표 당 유형이 두 개 있기 때문에 인덱스를 2씩 증가시켜 줄 수 있도록 하였다 ❕

profile
공부는 많은 양을 하진 않더라도 꾸준히 매일 하기

0개의 댓글