본문 바로가기
코딩테스트/프로그래머스Programmers

[프로그래머스][Lv.1][JAVA][2022 KAKAO TECH INTERNSHIP]성격 유형 검사하기

by 빔o0O 2024. 3. 29.

 

문제

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

 

4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.

검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.

  • 매우 비동의
  • 비동의
  • 약간 비동의
  • 모르겠음
  • 약간 동의
  • 동의
  • 매우 동의

각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.

예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.

 

 

이때 검사자가 질문에서 약간 동의 선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다. 만약 검사자가 매우 비동의 선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.

위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, 질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 있습니다.
하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.

  • 매우 동의나 매우 비동의 선택지를 선택하면 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

 

 

 

(*입출력 예 생략)

 


 

분석

  1. 하나의 지표에서 성격유형 점수가 같으면 두 유형 중 사전순으로 빠른 성격유형을 선택
    => 해당 유형을 char 로 바꾸어 코드값이 더 작은 것을 선택
  2. 1 <= choices[i] <= 3 이라면 survey[i].charAt(0) 의 점수가 올라간다.
  3. 반대로, 5 <= choices[i] <= 7 이라면 survey[i].charAt(1) 의 점수가 올라간다.
  4. 채점표는 MAP형태로 구현하는 것이 좋을듯.

 

 

 


 

피드백

  1. 통과는 했으나 이번에도 시간이 너무 오래 걸리는데, 이게 맞는 건가? 다른 사람의 풀이 보고 더 효율적인 방법 있는지 확인.

 

 

 


 

답안

import java.util.*;

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        int len = survey.length;
        Map<Character, Integer> typeMap = new HashMap(); 
        
        // 유형별 점수 계산
        for(int i = 0; i < len; i++) {
        	// '모르겠음'은 점수가 없으므로 패스 
        	if(choices[i] == 4)	continue;
        	
        	int score = 0; 
        	// '비동의'에 속하는 경우
        	if(choices[i] < 4) {
        		score = 4 - choices[i];
        		typeMap.put(survey[i].charAt(0), typeMap.getOrDefault(survey[i].charAt(0), 0) + score);
        	// '동의'에 속하는 경우
        	}else if(choices[i] > 4) {
        		score = choices[i] - 4;
        		typeMap.put(survey[i].charAt(1), typeMap.getOrDefault(survey[i].charAt(1), 0) + score);
        	}
        }
        
        // 점수에 따라 유형 분류
        answer += getType(typeMap, 'R', 'T');        	
        answer += getType(typeMap, 'C', 'F');        	
        answer += getType(typeMap, 'J', 'M');        	
        answer += getType(typeMap, 'A', 'N');        	
        return answer;
    }
    
    public static String getType(Map<Character, Integer> map, char a, char b) {
    	char c;
    	// 두 점수가 같은 경우 순번이 빠른 타입
    	if(map.getOrDefault(a, 0) == map.getOrDefault(b, 0)) {
        	c = a < b ? a : b;
        }else {
        	c = map.getOrDefault(a, 0) > map.getOrDefault(b, 0) ? a : b;
        }
    	return c + "";
    }
}

 

 

 


 

다른 사람의 답안

 

생각보다 다들 비슷한 방식으로 많이 처리했구나.

다른 사람의 답안은 생략.

 

 

 

 

 


 

🔗링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr