문제
나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 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
(*입출력 예 생략)
분석
- 하나의 지표에서 성격유형 점수가 같으면 두 유형 중 사전순으로 빠른 성격유형을 선택
=> 해당 유형을 char 로 바꾸어 코드값이 더 작은 것을 선택 - 1 <= choices[i] <= 3 이라면 survey[i].charAt(0) 의 점수가 올라간다.
- 반대로, 5 <= choices[i] <= 7 이라면 survey[i].charAt(1) 의 점수가 올라간다.
- 채점표는 MAP형태로 구현하는 것이 좋을듯.
피드백
- 통과는 했으나 이번에도 시간이 너무 오래 걸리는데, 이게 맞는 건가? 다른 사람의 풀이 보고 더 효율적인 방법 있는지 확인.
답안
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
'코딩테스트 > 프로그래머스Programmers' 카테고리의 다른 글
[프로그래머스][Lv.1][JAVA][2022 KAKAO BLIND RECRUITMENT]신고 결과 받기 (1) | 2024.04.03 |
---|---|
[프로그래머스][Lv.1][JAVA][2021 KAKAO BLIND RECRUITMENT]신규 아이디 추천 (1) | 2024.03.30 |
[프로그래머스][Lv.1][JAVA]키패드 누르기 (1) | 2024.03.27 |
[프로그래머스][Lv.1][JAVA]크레인 인형뽑기 게임 (2) | 2024.03.25 |
[프로그래머스][Lv.1][PCCE 기출문제] 10번 / 데이터 분석 (2) | 2024.03.23 |