문제
카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형은 아래와 같습니다.
지표 번호 | 성격 유형 |
1번 지표 | 라이언형(R), 튜브형(T) |
2번 지표 | 콘형(C), 프로도형(F) |
3번 지표 | 제이지형(J), 무지형(M) |
4번 지표 | 어피치형(A), 네오형(N) |
각각의 지표에 대해서 점수가 높은 알파벳을 조합하여 성격 유형 결과가 나옵니다. -> mbti를 생각하면 됨
ex) RCMA
검사지에는 총 n개의 질문이 있고 선택지 총 7개 입니다.
- 매우 비동의
- 비동의
- 약간 비동의
- 모르겠음
- 약간 동의
- 동의
- 매우 동의
검사자의 선택에 따라(동의/비동의) 한가지 지표의 한 개의 성격 유형에 대한 점수를 얻습니다. (1번 지표일 경우 비동의가 R, 동의가 T일 수도 있고, 동의가 R, 비동의가 T일 수 있음)
R(라이언형)이 비동의, T(튜브형)이 동의일 경우 점수는 아래와 같습니다.
답변 | 점수 |
매우 비동의 | 라이언형 3점 |
비동의 | 라이언형 2점 |
약간 비동의 | 라이언형 1점 |
모르겠음 | 어떤 성격 유형도 점수를 얻지 않음 |
약간 동의 | 튜브형 1점 |
동의 | 튜브형 2점 |
매우 동의 | 튜브형 3점 |
점수가 높은 지표를 조합하여 성격유형 검사 결과를 출력합니다.
입력
- survey : survey[i] 번째 문자열은 i+1 번째 문제의 성격유형을 의미 (2글자로 1번째 문자는 비동의, 2번째 문자는 동의에 해당하는 성격유형)
- ex) "RT", "MJ"
- choices : choices[i]는 검사자가 선택한 i+1번째 질문의 선택지
해결 과정
처음에는 Map을 이용하여 풀려고 했으나 Map으로 푸는 건 너무 흔할 것 같아 새로운 시도를 해보고 싶어 배열로 풀었습니다.
코드
public String solution(String[] survey, int[] choices) {
String answer = "";
// 설문자의 점수를 담을 정수형 배열 선언, 차례대로 R, C, J, A 형의 점수, 반대 점수는 음수로 더한다.
int[] scores = new int[4];
// 설문지 점수표를 담을 정수형 배열 선언, i번째 인덱스의 숫자가 i점의 점수
int[] scoreTable = {0, 3, 2, 1, 0, 1, 2, 3};
// 계산할 점수 지표를 담을 캐릭터형 선언
char indicator;
// 질문지의 길이만큼 순회하여 choices의 i번째 요소를 꺼낸다.
for(int i = 0; i < choices.length; i++) {
int choice = choices[i];
// 꺼낸 점수가 4일 경우 continue
if (choice == 4) continue;
// 꺼낸 점수가 1~3일 경우
if (choice < 4) {
// survey[i]의 0번째 캐릭터형이 점수 지표
indicator = survey[i].charAt(0);
} else { // 꺼낸 점수가 5~7일 경우
// survey[i]의 1번째 캐릭터형이 점수 지표
indicator = survey[i].charAt(1);
}
// indicator 에 따라 점수를 계산
switch(indicator) {
case 'R':
scores[0] += scoreTable[choice];
break;
case 'T':
scores[0] -= scoreTable[choice];
break;
case 'C':
scores[1] += scoreTable[choice];
break;
case 'F':
scores[1] -= scoreTable[choice];
break;
case 'J':
scores[2] += scoreTable[choice];
break;
case 'M':
scores[2] -= scoreTable[choice];
break;
case 'A':
scores[3] += scoreTable[choice];
break;
case 'N':
scores[3] -= scoreTable[choice];
break;
default: break;
}
}
// 점수 배열의 0번째 인덱스가 0이상인 경우 결과 문자열에 R, 음수일경우 T를 붙인다.
if (scores[0] >= 0) {
answer += "R";
} else answer += "T";
// 점수 배열의 1번째 인덱스가 0이상인 경우 결과 문자열에 C, 음수일경우 F를 붙인다.
if (scores[1] >= 0) {
answer += "C";
} else answer += "F";
// 점수 배열의 2번째 인덱스가 0이상인 경우 결과 문자열에 J, 음수일 경우 M을 붙인다.
if (scores[2] >= 0) {
answer += "J";
} else answer += "M";
// 점수 배열의 3번째 인덱스가 0이상인 경우 결과 문자열에 A, 음수일 경우 N을 붙인다.
if (scores[3] >= 0) {
answer += "A";
} else answer += "N";
return answer;
}
'JAVA > 해결한 문제' 카테고리의 다른 글
[Java/알고리즘] 숫자짝꿍 풀이 (프로그래머스 Lv.1) (0) | 2022.11.06 |
---|---|
[Java/알고리즘] Merge Sort (병합 정렬) (0) | 2022.10.26 |
[Java/알고리즘] Quick Sort(퀵 정렬) (0) | 2022.10.24 |
소수(prime number)인지 구하는 함수 구현하기 (3) | 2022.06.13 |
CC(Coin Change, 동전교환) 알고리즘 구현하기 (0) | 2022.06.06 |